C++ 在“delete”之后重用指针`
执行以下操作是否安全和/或良好实践C++ 在“delete”之后重用指针`,c++,memory-management,C++,Memory Management,执行以下操作是否安全和/或良好实践 //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]; } 我基本上放弃了前面的数组,因为我将使用不同的数据存储在类中,因此需要一个新的列表来存储关于新数据的其他
//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];
}
我基本上放弃了前面的数组,因为我将使用不同的数据存储在类中,因此需要一个新的
列表来存储关于新数据的其他信息。如果这不是一个好的做法,还有什么办法呢?这取决于具体情况。每次使用new创建对象时,必须在使用后将其删除。在给定的函数中,您正在删除以创建一个新的函数,但在处理完对象后是否也在删除?创建对象并让系统在对象超出范围时删除它更安全
如果可能的话,我会避免,因为如果不适当删除,可能会造成内存泄漏。是的,在删除指针指向的前一个内存后,重新使用指针来存储新的内存地址是完全可以的
只是要小心不要取消引用仍然存储在指针中的旧内存地址。但在代码片段中,这并不是问题
作为旁注,大多数情况下,如果您想要一个动态分配的数组,您应该使用std::vector
,如注释中所述。您所做的没有本质上的错误。但是,如果它是一个类的成员函数,并且list
是一个成员变量,请注意您拥有的代码不是异常安全的
换句话说,如果对new[]
的调用由于某种原因失败,则您的列表
数组已被销毁,您无法恢复数据
最好这样做:
void NewList(int size)
{
ListObject* temp = new ListObject[size];
delete[] list;
list = temp;
}
如果对new[]
的调用引发异常,则表明您尚未销毁原始数据
但是,如果您像其他人建议的那样使用了std::vector
,所有这些都会得到解决。您阅读了吗?将指针指定给新内存是合法的,它是否安全取决于代码的其余部分。“执行以下操作是否安全和/或良好做法?”是的,它是安全的。它是否好取决于意见。如果你需要使用数组(不太可能),你所做的是完全可以接受的。否则使用std::vector
好的,我只是不确定delete
是否会使指针无效,所以当我想重用它时,我想也许我应该保留一个分配内存地址的列表,在程序结束之前只对整个列表使用delete
。过一会儿我会读到“三法则”的链接。我讨厌像“使用向量”这样愚蠢的答案。那不是你的问题。是的,将一个新对象分配给一个已经“删除”的变量是非常安全和合适的。