【问题标题】:Will it cause a memory leakage on using free() to deallocate a heap allocated variable by new operator?使用 free() 通过 new 运算符释放堆分配的变量时会导致内存泄漏吗?
【发布时间】:2021-07-30 02:09:54
【问题描述】:
int* integer = new int{10};
cout << *integer << endl;
free(integer);
cout << *integer << endl;

输出:

10
0

根据我在我的机器上测试过的代码,很明显分配的内存被free()成功释放了

但是网上有文章不鼓励使用new操作符和用free()解除分配

如果有,是否存在内存泄漏的可能性。任何人都可以粘贴发生这种类型泄漏的示例代码

【问题讨论】:

  • 如果它们不是整数,如果你新建了一堆 std::string 然后释放了你会泄漏的数组,因为这些字符串的 dtor 不会被调用。
  • 一句话:不要
  • free() 释放new 的内存是未定义的行为可能 new 可以在内部使用malloc(),但不要依赖于此。 free() 肯定不会在非平凡类型上调用任何析构函数。因此,请始终使用delete 来释放new 的内存。
  • new 不需要使用malloc。通常它确实如此,但除非你有绝对令人信服的理由来打破 C++ 内存分配模型,否则使用delete 获得的内存是通过new 获得的,而delete[] 获得的内存是通过new[] 获得的。

标签: c++ memory-management memory-leaks


【解决方案1】:

使用free()释放new操作符的堆分配变量会导致内存泄漏吗?

这将导致未定义的行为。从技术上讲,内存泄漏包含在所有行为的集合中,因此它可能是任何结果的一部分,但在这种情况下,内存泄漏确实是您最不担心的问题。

让我明确一点:永远不要对 malloc(或其他相关 C 函数)未返回的任何内容调用 free

在对象的生命周期和存储期限结束后访问对象也有未定义的行为。也不要这样做。

任何人都可以粘贴发生这种类型泄漏的示例代码

从技术上讲,您并没有删除新的内容,因此您展示的程序是内存泄漏程序的示例。有趣的是,从技术上讲,未定义的行为意味着内存泄漏不一定会发生。无论如何,您没有证明程序中没有内存泄漏,因此没有理由假设没有泄漏。

a指向的值设置为0。为什么?

因为程序的行为是未定义的。

我的代码编译得很好

这不能证明没有内存泄漏。

【讨论】:

  • 我的代码中是否存在内存泄漏。因为在free() 之后。 a 指向的值设置为 0。为什么?我的代码编译得很好
  • @ArtazaSameen Is there a memory leakage in my code. 你使用了new。你没有使用delete,也没有间接使用delete。因此,您有内存泄漏。
  • 那为什么a设置为0。如果内存没有被释放
  • 但重要的是不要关注内存泄漏。泄漏只是感染程序的未定义行为的单一可能表现。也许程序会给你你想要的结果。也许不是。也许今天会,明天不会。也许在运行程序后不久,你会敲门,发现一个大个子问你是不是 Sarah Connor。未定义的行为是无法取胜的。
猜你喜欢
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2011-11-09
  • 2023-03-28
  • 2010-10-25
  • 1970-01-01
相关资源
最近更新 更多