【问题标题】:C++ deleting array only deallocates first itemC ++删除数组仅释放第一项
【发布时间】: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 也是如此。

标签: c++ memory


【解决方案1】:

你有一个悬空指针。悬空指针出现在对象销毁过程中,当具有传入引用的对象被删除或释放时,不修改指针的值,因此指针仍然指向释放内存的内存位置。

delete [] primeFactors;
primeFactors = nullptr; // pointer is no longer dangling

【讨论】:

  • 删除指针后将指针设置为空的想法是完全错误的。它只是提供了一种完全毫无价值的安全感。 OP应该使用的是市场指针,而不是直接使用new ..
猜你喜欢
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多