2014-10-09 90 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());