gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:07:01 26 4
gpt4 key购买 nike

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

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

最佳答案

我想让你在下面的场景中想象自己

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

是内存泄漏。

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

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

是的,你有内存泄漏。一个明目张胆的。您可以通过在请求更多之前通过 delete[] 返回内存来解决它。您可以通过使用多个指针并同时管理它们来解决它。您可以使用智能指针等智能构造来帮助生命周期管理来解决它。或者你可以像现代 C++ 程序员那样做:使用 RAII让代码和智能容器主要为您管理事物的策略。

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

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

关于c++ - 指向另一个数组并在末尾释放内存的指针是否被视为 c++ 中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70690458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com