C++ 如何将delete与两个指针指向的变量一起使用?

C++ 如何将delete与两个指针指向的变量一起使用?,c++,pointers,new-operator,delete-operator,C++,Pointers,New Operator,Delete Operator,假设我用new声明了一个假设指针,如下所示: int* hypothetical_pointer = new int; 并创建另一个具有相同值的假设指针: int* another_hypothetical_pointer = hypothetical_pointer; 如果我要删除这些用new声明的指针,我会同时删除两个指针,还是只删除用new显式声明的指针?或者我可以删除其中一个指针吗?只对其中一个指针调用delete——不管是哪个,因为它们都包含相同的值,作为一个指针。在调用delet

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

int* hypothetical_pointer = new int;
并创建另一个具有相同值的假设指针:

int* another_hypothetical_pointer = hypothetical_pointer;

如果我要删除这些用new声明的指针,我会同时删除两个指针,还是只删除用new显式声明的指针?或者我可以删除其中一个指针吗?

只对其中一个指针调用
delete
——不管是哪个,因为它们都包含相同的值,作为一个指针。在调用
delete
后不要使用任何一个指针对
new
的单个调用中只有一个内存块,因此当所有用户都使用完它时,您必须
删除它一次,而且只能删除一次

是容纳同一数据的多个用户的好方法-最后一个超出范围的引用在底层内存块上触发
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
boost::shared_ptr ptr1(新int);
boost::共享ptr ptr2(ptr1);
//当最后一个ptr1/ptr2超出范围时,内存被删除

delete
销毁指针指向的动态分配对象。不管是否有一个或100个指针指向该对象,您只能销毁一个对象一次

删除假设的\u指针之后
,不能使用
假想的\u指针
另一个\u假想的\u指针
,因为它们都不指向有效的对象


如果需要多个指针指向同一对象,则应使用共享所有权智能指针,如
shared\u ptr
,以确保对象不会过早销毁,并且只销毁一次。C++中的手工资源管理充满了危险,应该避免。

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


现在……如果他们都指向同一个问题,你认为你应该删除多少次他们的观点?

这就是为什么我们中的一些人推荐C++中的智能指针。我希望我们都推荐智能指针。但是,这是每个人都必须面对的问题。如果你用C++编写代码,你就要面对这个问题。这是一件好事:这意味着有一件事你要彻底而正确地理解,那就是为什么我们要使用智能指针。早失败,常失败@wilhelmtell“早期失败,经常失败!”我喜欢这样。
boost::shared_ptr
-它可以解决此类情况下的许多头痛问题。@wilhelmtell:我将看到您的RAII并向您提出一个SBRM。对于那些好奇的人来说,资源获取就是初始化(RAII)和范围限制资源管理(SBRM)是用于实现智能指针的通用设计模式的名称。在C++编程中理解和利用是最重要的设计模式,这是正确的,但没有用处。试着在没有智能指针的情况下这样做,你就会明白为什么这很难。可能有两个指针彼此完全独立,彼此不透明;当一方释放资源时,另一方对此一无所知。问题不在于智能指针。正如我在另一个答案中所评论的,它们在这样的情况下是有用的,但这是您对OP的情况所做的假设。有时智能指针是不正确的,您需要使用指针,理解其中涉及的语义是必要的。将指针复制到另一个实例并不少见:OP没有提到具体的情况。