【发布时间】:2018-05-05 23:03:54
【问题描述】:
我想从内存中删除一个数组,就好像它从未存在过一样。这是我正在运行的一些代码的简化。出于某种原因,删除数组只会删除第一项。
struct PrimeFactor {
int prime;
int degree;
};
totalPrimes = 3;
PrimeFactor* primeFactors = new PrimeFactor[totalPrimes];
primeFactors[0].prime = 2;
primeFactors[1].prime = 3;
primeFactors[2].prime = 5;
primeFactors[0].degree = 1;
primeFactors[1].degree = 2;
primeFactors[2].degree = 1;
for (int c = 0;c < totalPrimes; c++)
cout << c << " , " << primeFactors[c].prime << " , " << primeFactors[c].degree << "\n";
// Prints
// 0 , 2 , 1
// 1 , 3 , 2
// 2 , 5 , 1
delete [] primeFactors;
for (int c = 0;c < totalPrimes; c++)
cout << c << " , " << primeFactors[c].prime << " , " << primeFactors[c].degree << "\n";
// Prints
// 0 , 0 , 0
// 1 , 3 , 2
// 2 , 5 , 1
您看到只有primeFactors 数组的第一项被删除。我究竟做错了什么?如何彻底删除这个数组?
【问题讨论】:
-
尝试访问已删除的数组元素是未定义的行为。因此,您证明发生 3 次删除的努力是未定义的行为。相反,向您的 PrimeFactor 添加一个带有 cout 的析构函数。
-
一旦删除
primeFactors,任何访问其元素的尝试都是未定义的行为。最好使用 std::vector。 -
delete告诉您正在使用的任何分配器您已完成该内存。分配器可能会也可能不会真正触及你释放的内存,你不应该关心,因为你放弃了它。 -
@NeilButterworth 我已经看到 std::vector 在 C++ 中比数组更受欢迎。来自 java 和更高级别的语言,我尝试使用简单的项目,如数组而不是 java 中的数组列表,因为它们更快且不那么笨重。为什么要在 C++ 中使用向量?
-
向量与原始 C 样式数组一样快,但初始分配除外,并且更容易正确使用,正如您发布的代码所示。 Java 中的 ArrayLists 也是如此。