【问题标题】:C++ delete pointer allocated twiceC ++删除指针分配了两次
【发布时间】:2020-09-14 14:30:01
【问题描述】:

我正在尝试更多地了解 C++ 指针和释放内存。 假设我们有以下代码

int main{

  int * A = new int[4];
  int * B = new int[4];
  A = B;

  delete[] A;
  delete[] B;

  return 0;
}

A 指向一个新创建的指针,而 B 指向另一个指针,所以我们总共有两个指针。 现在说A = B 意味着A 和B 现在指向同一个指针。因此,在这种情况下,另一个指针会发生什么?我们怎样才能删除它?

【问题讨论】:

  • 1) 它永远丢失了,2) 你不能。附: “A 和 B”不是“指向同一个指针”。
  • @SamVarshavchik 他们指的是什么?
  • A = B;delete[] A; 语句应该交换以避免内存泄漏。
  • 他们指向ints。它们没有指向另一个指针。
  • @HasanH 即使那样你也不应该使用new ;)。智能指针可在您需要时提供对它们管理的指针的访问

标签: c++ pointers


【解决方案1】:

那么在这种情况下,另一个指针会发生什么?

它丢失了。您删除了对数组 A 指向的最后一个引用(AB 没有指向指针。它们是指针,它们确实分别指向数组的第一个元素,即 ints )。

我们怎样才能删除它?

你不能。内存泄露。

永远不要使用原始的拥有指针。对于动态数组,您可以使用std::vector,对于其他数组,您可以使用智能指针。使用std::vector,您的代码将是:

#include <vector>
int main{
    auto A = std::vector<int>(4);
    auto B = std::vector<int>(4);
    A = B;
}

为了完整起见,您的代码还有一个无泄漏版本:

void please_dont_do_this() {    
  int * A = new int[4];
  int * B = new int[4];

  delete [] A; // delete the array before the pointer is lost

  A = B;

  delete[] B;  // delete the array only once !    
}

PS:我知道这种观点在想要尽可能多地学习的热心初学者中不太受欢迎,但是恕我直言,关于 C++ 中的原始指针,您需要了解的最重要的一点是您几乎不需要它们(而且当您认为你需要它们,那么很可能你仍然不需要)。

【讨论】:

  • 非常感谢您的解释。这已经足够了
【解决方案2】:

这里的指针没什么特别的。

int i = 3;
i = 4;

3 怎么了?它消失了,被i = 4 覆盖。指针也一样:

int *p = new int[4];
int *q = new int[4];

p 指向int 数组,q 指向另一个int 数组。

p = q;

p 的旧值消失了,被p = q 覆盖。 pq 现在持有 相同 指针值,并且该指针指向第二次调用 new int[4] 分配的内存。

要释放在第一次调用new int[4] 时分配的内存,您必须抓住new 返回的指针。

【讨论】:

    猜你喜欢
    • 2014-09-28
    • 2011-12-17
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2012-10-26
    • 2020-09-25
    • 2019-09-17
    相关资源
    最近更新 更多