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

Sar*_*rah 2 c++ pointers memory-leaks

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

为指针分配了新的内存后,长度为5的旧内存会发生什么情况呢?如果是内存泄漏,我应该使用 realloc() 代替吗?

Who*_*aig 6

我希望你想象一下下面场景中的自己

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

是内存泄漏。

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

  • 在你要求新球之前,你可以把球扔回给我。
  • 你可以打破束缚你另一只手臂的枷锁,然后抓住它。现在你两只手上有两个球(例如,两个指针持有两个分配),这两个球你(希望)有一天用完后都会扔回给我。
  • 你可以使用一个大肆宣传的原型球,它具有自动魔法超级归航信标逻辑,所以如果被扔到一边,它不会掉入深渊。相反,它知道如何自己找到回到我身边的路。(智能指针)。
  • 你可以使用一个特殊的球,它知道如何在需要时(在某种程度上)本能地要求我提供更大的尺寸。(astd::vector为例)
  • ETC。

是的,你有内存泄漏。一个明目张胆的。delete[]您可以通过在要求更多之前返回内存来解决此问题。您可以通过使用多个指针并同时管理它们来解决此问题。您可以使用智能结构(例如智能指针)来解决该问题,以协助生命周期管理。或者你可以做现代 C++ 程序员所做的事情:使用RAII策略让代码和智能容器主要管理事情为您管理事务。

至于realloc……只是不要realloc是一种用于调整缓冲区大小(甚至在需要时分配缓冲区)的 C 机制。但它对存储在其中的复杂实体的特征一无所知。未能正确地构建和破坏如此复杂的对象会带来灾难,这将在后面提到。

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