在“删除”之后重用指针

Posted

技术标签:

【中文标题】在“删除”之后重用指针【英文标题】:Reusing a pointer after `delete` 【发布时间】:2015-02-07 06:49:26 【问题描述】:

执行以下操作是否安全和/或良好做法?

//NewList is a member function of a class
void NewList(int size)

delete[] list; //list is a member variable; an already initialized dynamic array.

list=new ListObject[size];


我基本上放弃了以前的数组,因为我将使用不同的数据存储在类中,因此需要一个新的list 来存储关于新数据的其他信息。如果这不是好的做法,还有什么替代方法?

【问题讨论】:

你读过Rule of Three吗?分配一个指向新内存的指针是合法的,它是否安全取决于代码的其余部分。 “执行以下操作是否安全和/或良好做法?”是的,它是安全的。好不好看,见仁见智。 如果您需要使用数组(不太可能),您正在做的事情是完全可以接受的。否则使用std::vector 好吧,我只是不确定delete是否会使指针失效,所以当我想重用它时,我想也许我应该保留一个分配的内存地址列表并且只使用delete 在程序结束前的整个列表中。稍后我会阅读链接“三法则”。 我讨厌“使用向量”之类的愚蠢答案。那不是你的问题。是的,将新对象分配给您已经“删除”的变量是非常安全且非常合适的。 【参考方案1】:

这取决于。每次使用new创建对象时,使用后必须删除。在给定的函数中,您要删除以创建一个新函数,但是在完成对象后您是否也要删除?创建对象并在对象超出范围时让系统将其删除会更安全。

如果可能,我会尽量避免,因为如果没有正确删除,可能会造成内存泄漏。

【讨论】:

【参考方案2】:

是的,在删除它指向的前一个内存之后,重新使用一个指针来存储一个新的内存地址是完全可以的。

请注意不要取消引用仍存储在指针中的旧内存地址。不过,在您的代码 sn-p 中,这不是问题。

附带说明一下,大多数情况下,如果您想要一个动态分配的数组,您应该使用 std::vector,如 cmets 中所述。

【讨论】:

【参考方案3】:

您所做的事情本身并没有错。但是,如果它是类的成员函数,并且list 是成员变量,请注意您拥有的代码不是异常安全的。

换句话说,如果对new[] 的调用由于某种原因失败,则您的list 数组已被破坏,您无法恢复数据。

最好这样做:

void NewList(int size)

    ListObject* temp = new ListObject[size]; 
    delete[] list; 
    list = temp;

如果对new[] 的调用引发异常,则说明您没有破坏原始数据。

但是,正如其他人所建议的那样,如果您使用 std::vector,所有这些都将得到解决。

【讨论】:

以上是关于在“删除”之后重用指针的主要内容,如果未能解决你的问题,请参考以下文章

sql查找最小缺失值与重用被删除的键(转载)

我可以在 commit() 之后重用 UserTransaction 实例吗?

PHP “substr_replace()”释放后重用远程内存破坏漏洞

添加、重用和删除 NSLayoutAnchors

再次重用 Deallocated Cursor 进行删除

c++重用和模板