在“删除”之后重用指针
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
,所有这些都会得到解决,正如其他人所建议的那样。
做以下事情安全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
,所有这些都会得到解决,正如其他人所建议的那样。