疯狂的unique_ptr语法

时间:2014-10-09 01:44:57

标签: c++ c++11 unique-ptr

我最近使用这种语法作为指针:

std::vector<Shader *>* _shaderArray;

问题是我开始出现内存泄漏错误。所以现在我决定使用unique_pointers,所以我不再需要担心这个问题。但据我所知,c ++ 11语法中的上述语法是:

std::unique_ptr<std::vector<std::unique_ptr<Shader>>> _shaderArray;

如果这是正确的,我该如何初始化它?这段代码给了我错误:

_shaderArray = new std::vector<Shader *>( );

2 个答案:

答案 0 :(得分:2)

在声明

处初始化unique_ptr
std::unique_ptr<std::vector<std::unique_ptr<Shader>>> _shaderArray{new std::vector<std::unique_ptr<Shader>>( )};

完整(可编辑)最小例子:

#include <vector>
#include <memory>

class Shader{};

int main() 
{
    std::unique_ptr<std::vector<std::unique_ptr<Shader>>> _shaderArray{new std::vector<std::unique_ptr<Shader>>( )};
}

答案 1 :(得分:1)

在您的具体情况下,我建议使用typedefusing别名来简化这个非常长的陈述:

using ShaderPtrVec = std::vector<std::unique_ptr<Shader>>;

using ShaderPtrVecPtr = std::unique_ptr<ShaderPtrVec>;

然后,使用它变得更加清晰:

ShaderPtrVecPtr shaderArray( new ShaderPtrVec( ) );

或者,如果您碰巧已经声明了唯一指针但需要重新分配其内容,则可以使用reset

shaderArray.reset( new ShaderPtrVec( ) );