智能指针和数组

hel*_*922 44 c++ smart-pointers c++11

智能指针如何处理数组?例如,

void function(void)
{
    std::unique_ptr<int> my_array(new int[5]);
}
Run Code Online (Sandbox Code Playgroud)

my_array超出范围并被破坏时,整个整数数组是否会被重新声明?只回收了数组中的第一个元素吗?或者还有其他事情发生(例如未定义的行为)?

Alo*_*ave 75

它将调用delete[],因此整个数组将被回收,但我相信你需要表明你使用的数组形式unique_ptr:

std::unique_ptr<int[]> my_array(new int[5]);
Run Code Online (Sandbox Code Playgroud)

这被称为局部特殊化unique_ptr.

  • 琐事:这是发明这种语法的地方:http://groups.google.com/group/comp.lang.c++/browse_thread/thread/469fcc136b8f2d42/59c0491245293db7?q =%3Cchar%5B%5D%3E + group:comp .lang.c%2B%2B +作者:Hinnant(欣南特) (26认同)
  • @Howard Hinnant:谢谢你的琐事,我对此并不了解.你是那个发明它的人,早在2001年!你来这里真是太酷了:) (6认同)

Nat*_*one 6

编辑:正如下面的评论所解释的那样,这个答案是错误的。这是我最初所说的:

我不认为 std::unique_ptr 知道调用 delete[]。它实际上有一个 int* 作为成员——当你删除一个 int* 时,它会删除整个数组,所以在这种情况下你没问题。

delete[] 与普通删除相反的唯一目的是它调用数组中每个元素的析构函数。对于原始类型,这无关紧要。

我把它留在这里是因为我学到了一些东西——希望其他人也能。

  • -1 : `delete` 必须始终且只能与 `new` 一起使用;类似地,`delete[]` 必须始终且只能与 `new[]` 一起使用。参见 C++2003,第 5.3.5 节(expr.delete),第 2 段。 (4认同)
  • @Nathan:这很重要。它不仅仅是析构函数。内存分配例程取决于您使用匹配的分配方法删除内存。因此 new/delete 和 new[]/delete[] 是匹配对。 (3认同)