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

标签 c++ pointers memory-leaks

#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/

相关文章:

c++ - 显示结构/类错误数组 C++

.net - .Net应用程序中极端私有(private)字节使用分析, native 内存泄漏?

javascript - jQuery 的响应文本的 AJAX 内存泄漏?

ios - SpriteKit - CPU/Memory leak on segue back to main screen

c++ - 为什么bernoulli_distribution::param_type 的构造函数是显式的?

c++ - 为什么c++中数组的内容有时没有初始化?

c++ - 什么是尼布洛德?

c# - 使用指向 C# 中的函数的指针作为参数调用 C++ 函数

c - *变量!=0 是什么意思?

c - 在 C 中使用 sscanf 检测字符串中的空字符