我将省略相当多的代码,因为这些是一些相当大的对象,而我的问题实际上只涉及 std::make_shared 的操作。我在命名空间 SYNC 中有一个名为 D3D11Shader 的对象。这有一个static函数调用,
SYNC::D3D11Shader * SYNC::D3D11Shader::CreateInstance(const std::string & s)
它将采用字符串索引并返回指向从 SYNC::D3D11Shader 派生的着色器实例的指针。有一次,我开始使用智能指针在保存所有这些着色器的向量中自动释放这些着色器。然而,当我去做这件事时,
std::shared_ptr<SYNC::D3D11Shader> shaderPtr;
// ... verification of index and other initialization happens here
// so i am unable to initialize it in it's constructor
shaderPtr = std::make_shared<SYNC::D3D11Shader>(SYNC::D3D11Shader::CreateShader(shaderName));
编译器错误说我正在尝试在这一行中实例化 D3D11Shader 的实例,这是一个抽象类。我认为 make_shared 所做的只是返回 std::shared_ptr 的实例。 CreateInstance 函数从不尝试创建此类的实例,而只是创建派生并实现该类的对象。在使用此函数和智能指针之前我没有收到此错误。有谁知道这是怎么回事?
如果你不能使用构造函数shared_ptr
,使用其reset成员函数 http://en.cppreference.com/w/cpp/memory/shared_ptr/reset赋予它新对象的所有权:
std::shared_ptr<SYNC::D3D11Shader> shaderPtr;
shaderPtr.reset(SYNC::D3D11Shader::CreateShader(shaderName));
原因make_shared<T>
不适合这种情况是因为它构建了一个新的T
,将其参数转发给其构造函数。不过,您已经构造了一个对象,因此您只想将所有权授予共享指针。
我强烈建议不要返回原始指针CreateShader
尽管。您依赖于以下呼叫者CreateShader
知道将其包装在智能指针中或调用delete
在上面。你最好返回一个unique_ptr
直接将所有权传递给客户,然后他们可以制作shared_ptr
如果他们愿意的话,就可以摆脱它。请参阅以下内容:
std::unique_ptr<SYNC::D3D11Shader> uniquePtr(SYNC::D3D11Shader::CreateShader(shaderName));
// If you want a shared_ptr:
std::shared_ptr<SYNC::D3D11Shader> sharedPtr(std::move(uniquePtr));
或者简单地:
std::shared_ptr<SYNC::D3D11Shader> sharedPtr = SYNC::D3D11Shader::CreateShader(shaderName);
如果您要使用智能指针,请使用它们。 :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)