在“删除”之后重用指针

Reusing a pointer after `delete`

做以下事情安全and/or好吗?

//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];

}

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

视情况而定。每次用new创建一个对象,用完一定要删除。在给定的函数中,您正在删除以创建一个新函数,但是一旦您完成了该对象,您是否也在删除?创建对象并在对象超出范围时让系统删除它会更安全。

我会尽可能避免,因为如果删除不当可能会造成内存泄漏。

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

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

作为旁注,大多数时候,如果您想要一个动态分配的数组,您应该使用 std::vector,如评论中所述。

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

换句话说,如果new[]的调用由于某种原因失败了,那么你的list数组已经被破坏了,你就无法恢复数据了。

最好这样做:

void NewList(int size)
{
    ListObject* temp = new ListObject[size]; 
    delete[] list; 
    list = temp;
}

如果对 new[] 的调用抛出异常,则您没有破坏原始数据。

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