2014-10-09 91 views
0

我最近使用这个语法的指针:疯狂的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

初始化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>>()}; 
} 
+0

给我一个“新”的错误。它说Error:期望一个类型说明符,因为我有两个独特的指针,也许我应该初始化两个 – lhahn 2014-10-09 01:53:20

+0

上面的声明在我的一侧编译没有错误(包括g ++和clang)。确保你使用'-std = C++ 11'标志来启用'C++ 11' – vsoftco 2014-10-09 01:55:15

+0

我想把它包含在一个私有成员中,但我没有在这里编译(visual studio 2013 express),我会尝试那 – lhahn 2014-10-09 01:56:19

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());