如何将所有权从一个共享指针向量转移到另一个向量?
How to transfer ownership from a vector of shared pointers to another one?
我试图了解C++传递数据的最佳方式是什么。在下面的示例中,我尝试将数据的所有权(着色器)传递给一个类(着色器程序)。
我可以使用原始指针来做到这一点,但这增加了管理其生命周期的需求,而我不想这样做。 不幸的是,当我尝试移动共享指针时,我在方法中遇到了read access violation
。
std::shared_ptr<ShaderProgram> modelShaders; // this is inside another class, but I guess it's not too important
int main() {
std::shared_ptr<Shader> vert = std::make_shared<Shader>(Shader::VERTEX, std::string("res/shaders/model/basic.vert"));
std::shared_ptr<Shader> frag = std::make_shared<Shader>(Shader::FRAGMENT, std::string("res/shaders/model/basic.frag"));
std::vector<std::shared_ptr<Shader>> shaders;
shaders.push_back(std::move(vert));
shaders.push_back(std::move(frag));
modelShaders->compileShaders( shaders );
}
// std::vector<std::shared_ptr<Shader>> m_shaders; definition inside the class
void ShaderProgram::compileShaders(std::vector<std::shared_ptr<Shader>> &shaders)
{
GLuint program = glCreateProgram();
for (auto shaderIter = shaders.begin(); shaderIter != shaders.end(); shaderIter++)
{
std::shared_ptr shader = *shaderIter;
GLuint shaderID = compileShader(shader);
GL(glAttachShader(program, shaderID));
shader->setID(shaderID);
m_shaders.push_back(std::move(shader)); // here I get a read access violation
}
我的目的是避免在不需要的情况下创建/销毁类。我不希望销毁或复制着色器实例。
PS:如果有人可以推荐一些关于传递数据的文章等,那就太好了!
编辑
class ShaderProgram
{
private:
std::vector<std::shared_ptr<Shader>> m_shaders;
public:
ShaderProgram()
: m_id(0) {};
~ShaderProgram() {
std::cout << "[ShaderProgram] destroyed" << std::endl;
};
...
GLuint compileShader(const std::shared_ptr<Shader>& shader);
void compileShaders(const std::vector<std::shared_ptr<Shader>> &shaders);
...
GLuint ShaderProgram::compileShader(const std::shared_ptr<Shader> &shader) {
GLuint id = 0;
std::string src = shader->getSource();
const char* cSrc = src.c_str();
GL((id = glCreateShader(shader->getGLType())));
GL(glShaderSource(id, 1, &cSrc, NULL));
GL(glCompileShader(id));
if (GetStatus(id, Status::SHADER, GL_COMPILE_STATUS, shader->getName(), "COMPILATION FAILURE") != GL_TRUE)
{
return 0;
}
return id;
}
该问题与std::vector<std::shared_ptr<Shader>> m_shaders;
未在构造函数中初始化有关。我承受着压力,这是<vector>
自动处理的,但事实并非如此。通过添加以下代码,一切按预期工作:
ShaderProgram() : m_shaders(std::vector<std::shared_ptr<Shader>>()) {};
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 使用向量类的c++指针
- 如何使用C++初始化向量;脚本化值不是数组、指针或矢量错误
- 如何更改唯一指针向量的可见性
- C++ 独特指针练习的向量
- C 中的向量指针的清晰图
- 当向量位于内部类中时,如何删除指向对象的向量指针
- std::向量指针
- 指向结构体的向量指针错误
- 删除指向指针的向量指针时出错
- 映射不同类型的向量指针
- 在c++中传递向量指针
- 虚拟类的向量:指针是干净的方法吗
- 如何从另一个向量/对象集构造新的向量/指针集
- 模型视图控制器- c++向量指针,太多的传递
- 为什么向量指针占用这么多内存?
- 删除条目向量指针的静态映射c++
- 复向量指针
- c++数组向量指针的初始化