C ++ 11堆栈分配与Unique_Ptr

时间:2016-01-20 07:28:21

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

我正在使用C ++ 11。我意识到我可以这样做并在堆栈上分配:

void someclasS::somefn(int naz) {
    Ipp32f absValues[naz] // <--naz is dynamic
    //.....more code
    //.....
}

我以为我不应该这样做? 以前我这样做:

std::unique_ptr<Ipp32f[]> absValues(new Ipp32f[naz]); 
// when need to pass pointer have to use absValues.get()

避免删除内存。

如果可能的话,我非常想做前者,因为它看起来更整洁。但这样做有什么后果呢?

2 个答案:

答案 0 :(得分:3)

它的工作原理是因为编译器接受VLAs,即使它们在C ++中不是标准的。

正常的方法是使用std::vector,正如Humam Helfawi所说。

不允许使用VLA的理由是要么您确定没有堆栈溢出,因为大小有上限(在这种情况下只是分配该大小)或数量是无限制的,您确实应该分配它在免费商店,因为这可以更好地处理内存不足的情况。

答案 1 :(得分:2)

  

如果可能的话,我非常想做前者,因为它看起来更整洁

只需使用std::vector

std::vector<Ipp32f> absValues(naz);

如果您有一个具有此声明的函数,则结果是连续的:

ppsZero_32f(Ipp32f* ptr, int len);

你可以像这样传递你的矢量:

ppsZero_32f(absValues.data(),absValues.size());