在“删除”之后重用指针
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
,所有这些都将得到解决。
【讨论】:
以上是关于在“删除”之后重用指针的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 commit() 之后重用 UserTransaction 实例吗?