假设我有一个用new
声明的假设指针,如下所示:
int* hypothetical_pointer = new int;
并创建另一个具有相同值的假设指针:
int* another_hypothetical_pointer = hypothetical_pointer;
如果我要删除使用new声明的这些,我是否必须删除两个指针,或者只删除用new声明的指针?或者我可以删除指针吗?
答案 0 :(得分:14)
delete
销毁指针指向的动态分配对象。如果有一个或100个指针指向该对象并不重要,则只能销毁一次对象。
在delete hypothetical_pointer;
之后,您无法使用hypothetical_pointer
或another_hypothetical_pointer
,因为它们都没有指向有效对象。
如果需要多个指针指向同一个对象,则应使用共享所有权智能指针,如shared_ptr
,以确保对象不会过早被破坏,并且它只被销毁一次。 C ++中的手动资源管理充满了危险,应该避免使用。
答案 1 :(得分:8)
new
的单个来电只有一个内存块,所以当所有用户完成后,您必须delete
一次,只需一次。
boost::shared_ptr是一种很好的方式来容纳相同数据的多个用户 - 最后一个引用超出范围触发基础内存块上的delete
。
boost::shared_ptr<int> ptr1(new int);
boost::shared_ptr<int> ptr2(ptr1);
// memory deleted when last of ptr1/ptr2 goes out of scope
答案 2 :(得分:4)
只在其中一个指针上调用delete
- 无关紧要,因为它们都包含相同的值,作为指针。调用delete
后不要使用任何一个指针。
答案 3 :(得分:2)
正确的答案是你也不删除。你删除了他们指出的内容。
现在......如果他们都指出同一件事,你认为你应该删除他们指出的内容多少次?