auto_ptr指向动态数组

时间:2013-07-17 05:37:26

标签: c++ auto-ptr

在我的代码中,我使用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;
}

3 个答案:

答案 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指针;在全球范围内。 这意味着只有在程序存在时它才会被删除,即使你泄漏内存也会发生这种情况。