在我的代码中,我使用new分配整数数组。之后我将这个指针包装到auto_ptr。我知道auto_ptr会自动调用它的析构函数。由于我的auto_ptr指向一个数组(使用new分配),数组是否会与auto_ptr一起被删除,否则会导致内存泄漏。这是我的示例代码。
std::auto_ptr<int> pointer;
void function()
{
int *array = new int[2];
array[0] = 10;
array[1] = 20;
pointer.reset((int*) array);
}
int _tmain(int argc, _TCHAR* argv[])
{
function();
return 0;
}
答案 0 :(得分:9)
阵列将不正确删除。 auto_ptr
使用delete contained_item;
。对于数组,它需要使用delete [] contained_item;
。结果是未定义的行为。
正如James McNellis所说,你真的想std::vector
在这里 - 没有new
,没有auto_ptr
而且没有后顾之忧。
答案 1 :(得分:8)
你不能使用std :: auto_ptr来处理动态数组,因为它不知道如何区分delete和delete []。
此外,不推荐使用auto_ptr
,在C ++ 11中,您可以将std::unique_ptr
用于:
int *array = new int[2];
std::unique_ptr<int[]> pointer(array);
答案 2 :(得分:1)
正如其他人所说auto_ptr是错误的用法,std :: vector是最好的。但是你也可以使用boost :: scoped_array。但请注意,您希望在创建时重置,否则您也可以使用删除。 pointer.reset(new int [2]);
或更好,但喜欢这个boost :: scoped_array arr(new int [2]);
也没有必要创建一个静态std :: auto_ptr指针;在全球范围内。 这意味着只有在程序存在时它才会被删除,即使你泄漏内存也会发生这种情况。