4

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

3 回答 3

9

数组不会被正确删除。auto_ptr使用delete contained_item;. 对于数组,它需要改为使用delete [] contained_item;。结果是未定义的行为。

正如 James McNellis 所说,你真的想要std::vector这里——不new,不auto_ptr,不用担心。

于 2013-07-17T05:42:00.247 回答
8

您不能使用 std::auto_ptr 来处理动态数组,因为它不知道如何区分 delete 和 delete[]。

此外,auto_ptr已弃用,在 C++11 中,您可以使用std::unique_ptr

int *array = new int[2];
std::unique_ptr<int[]> pointer(array);
于 2013-07-17T05:42:31.177 回答
1

正如其他人所说, auto_ptr 使用错误, std::vector 是最好的。但是你也可以使用 boost::scoped_array。但请注意,您要在创建时重置,否则您不妨使用删除。指针.reset(new int[2]);

或者更好的是 boost::scoped_array arr(new int[2]);

也没有必要创建静态 std::auto_ptr 指针;在全球范围内。这意味着它只会在程序存在时被删除,即使您泄漏内存也会发生这种情况。

于 2013-07-17T05:45:18.550 回答