如何使用两个指针指向的变量删除?

时间:2010-12-08 21:28:27

标签: c++ pointers new-operator delete-operator

假设我有一个用new声明的假设指针,如下所示:

int* hypothetical_pointer = new int;

并创建另一个具有相同值的假设指针:

int* another_hypothetical_pointer = hypothetical_pointer;

如果我要删除使用new声明的这些,我是否必须删除两个指针,或者只删除用new声明的指针?或者我可以删除指针吗?

4 个答案:

答案 0 :(得分:14)

delete销毁指针指向的动态分配对象。如果有一个或100个指针指向该对象并不重要,则只能销毁一次对象。

delete hypothetical_pointer;之后,您无法使用hypothetical_pointeranother_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)

正确的答案是你也不删除。你删除了他们指出的内容。

现在......如果他们都指出同一件事,你认为你应该删除他们指出的内容多少次?