在`delete`之后重用指针

时间:2015-02-07 06:49:26

标签: 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];

}

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

3 个答案:

答案 0 :(得分:3)

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

如果可能的话,我会避免,因为如果没有适当删除,你可以创建内存泄漏。

答案 1 :(得分:3)

是的,在删除指向的前一个内存后,重复使用指针存储新的内存地址是完全没错的。

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

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

答案 2 :(得分:1)

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

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

最好这样做:

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

如果对new[]的调用引发异常,则您尚未销毁原始数据。

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