指向另一个数组并在末尾释放内存的指针是否被视为 c++ 中的内存泄漏?

Is a pointer pointing to another array and deallocating memory at the end considered as memory leak in c++?

#include <iostream>
using namespace std;
int main()
{
int* pointer = new int[5];
pointer = new int [10];
delete[] pointer;
return 0;
}

为指针分配新内存后,长度为5的旧内存会怎样?如果是内存泄漏,我应该改用realloc()吗?

我希望你想象一下自己处于以下场景

  • 你站在深渊旁边,一只手被绑在背后。因此,您只有一只手可用。那只手是你的 pointer var.
  • 有时你要求我给你扔球。那个球是通过 new.
  • 分配的内存
  • 我把球扔给你,你用一只空手接球。你本身并不“拥有”球,但它完全是借给你的,并且是你的专属责任。我相信你会把它扔回去 if/when 你不再需要它了。
  • 现在,如果你愿意的话,你要求我给你扔一个不同的球,一个新的 new
  • 我这样做,你接住新球,但这样做你首先丢掉了旧球(双关语;是的,你“丢了球”)。它坠入深渊。最终落在何处无人知晓。但是现在你拿着第二个球。
  • 现在是 return 我发给你的球的时候了。你把你还有的扔给我,很好。但是第一个永远消失了。它不在任何人的手中,也没有人知道它在哪里。

是内存泄漏。

可以通过多种方式规避它。

  • 你可以在申请新球之前把球扔回给我。
  • 你可以挣脱束缚你另一只手臂的枷锁,然后抓住它。现在你有两只手的两个球(例如,两个分配在两个指针中),你会(希望)有一天在完成它们后将它们扔回给我。
  • 您可以使用具有自动魔法超级归巢信标逻辑的大肆宣传的原型球,因此即使被扔到一边它也不会掉入深渊。相反,它知道如何自己找到回到我身边的路。 (智能指针)。
  • 你可以使用一个特殊的球,它知道如何在需要时(在一定程度上)本能地向我询问更大的尺寸。 (例如std::vector
  • 等等

是的,您有内存泄漏。一个明目张胆的。您可以通过 return 通过 delete[] 内存来解决它,然后再要求更多。您可以通过使用多个指针并同时管理它们来解决它。您可以使用智能指针等智能构造来帮助生命周期管理来解决它。或者您可以像现代 C++ 程序员一样:使用 RAII 策略让代码和智能容器为您管理 大部分

关于realloc...只是不要realloc 是一种用于调整缓冲区大小(甚至在需要时分配它们)的 C 机制。但它对存储在其中的复杂实体的特征一无所知。未能正确构造和销毁具有如此复杂性的对象会引发灾难,后来被引用。

在漫长的 运行 中,接受使用不同语言、不同模式和方法进行编程的概念。 C 没有像 std::vector 这样的所有这些神奇的容器; 你会。 C 没有智能指针; 你会。等等。尽早并经常拥抱它。它会在未来多次收回成本。