2011-07-15 212 views
33

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

void function(void) 
{ 
    std::unique_ptr<int> my_array(new int[5]); 
} 

my_array超出范围和被破坏,并在整个整数数组得到重新声称?只有数组的第一个元素被回收?或者还有其他事情正在发生(比如未定义的行为)?

回答

63

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

std::unique_ptr<int[]> my_array(new int[5]); 

。这被称作偏专业化unique_ptr

+19

琐事:这是语法得到发明的地方:http://groups.google.com/group/comp.lang.c++/browse_thread/thread/469fcc136b8f2d42/59c0491245293db7?q=%3Cchar%5B%5D%3E+ group:comp.lang.c%2B%2B + author:hinnant –

+5

@霍南德:感谢你的琐事,我不知道它。早在2001年,你就是发明它的人!这太酷了,让你在这里:) –

+0

这也是唯一有意义的方法,请考虑'typedef int(three_ints)[3];模板 void function(void){unique_ptr p(new T); }函数();' –

2

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

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

删除[]与正常删除相对的唯一目的是它调用数组中每个元素的析构函数。对于原始的 类型,这并不重要。

因为我学到了一些东西 - 我希望别人也会这样,所以我要离开它。

+1

如果你使用'new []'你应该使用'delete []'并且'std :: unique_ptr'足够聪明来处理这个以及许多其他的改进,这就是为什么它很快会替换'std :: auto_ptr'的原因。 – AJG85

+4

-1:'delete'必须始终且只能与'new'一起使用;同样'delete []'必须总是,只能用于'new []'。请参阅C++ 2003,第5.3.5节(expr.delete),第2段。 –

+3

@Nathan:这很重要。它不仅仅是析构函数。内存分配例程取决于您使用匹配的分配方法删除内存。因此new/delete和new []/delete []是匹配的对。 –