【发布时间】:2019-10-09 13:18:33
【问题描述】:
在 C++ 中使用 delete 运算符时,我很难理解正确的事件顺序。我已经内化了使用它的正确方法是当指针仍在引用指针时。
在下面的示例中 - 我将数组的内容复制到 temp 中,然后将 delete [] 复制到我的 arrayPointer 指向的旧数组中。
然后我将arrayPointer 指向新创建的数组并将不再需要的temp 设置为nullptr。我想通过不删除临时指针来确保不会导致内存泄漏。这还需要发生吗?
我之所以这么问,是因为我看到过我们先指向 nullptr 然后指向 delete 的示例,但这似乎违反直觉。任何指导将不胜感激。谢谢!
template <class T>
void ValSet<T>::add(T elementToAdd){
if(!this->contains(elementToAdd)){
if(sizeOfArray == numOfElements){
sizeOfArray *= 2;
T* temp = new T[sizeOfArray];
for (int i = 0; i < numOfElements; i++)
temp[i] = arrayPointer[i];
delete [] arrayPointer;
arrayPointer = temp;
temp = nullptr;
}
numOfElements += 1;
arrayPointer[numOfElements-1] = elementToAdd;
}
}
【问题讨论】:
-
您的代码在我看来没问题。
temp = nullptr;是不必要但无害的;temp很快就会超出范围。 -
旁注,我想你想要`delete arrayPointer`而不是
delete [] arrayPointer。 -
@Chipster - 这真的很有趣,但有点道理。成员 var 是指向 T 的指针,但是当构造 ValSet 对象时,arrayPointer 会创建一个新数组 - 那么 delete 是否适用于该上下文中的指针本身或创建的新数组?
-
@Chipster 假设
arrayPointer的分配方式相同(应该是,无论是以前在add中分配还是任何其他调整大小的方法),那么delete [] arrayPointer是正确的方式销毁对象并释放内存。 (more details here) -
@T.j.Banghart 有一个缺陷。如果
new[]抛出异常,sizeOfArray现在有错误的值,而不是抛出异常之前的原始值。在调用new[]之前,您需要恢复(或不更改)对象的状态。我假设sizeOfArray是一个成员变量。
标签: c++ arrays pointers dynamic delete-operator