Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在“delete”之后重用指针`_C++_Memory Management - Fatal编程技术网

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
。过一会儿我会读到“三法则”的链接。我讨厌像“使用向量”这样愚蠢的答案。那不是你的问题。是的,将一个新对象分配给一个已经“删除”的变量是非常安全和合适的。