问题标签 [free]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1738 浏览

c - 驯服 malloc/free 野兽——提示和技巧

我一直在一些项目中使用 C 来获得硕士学位,但从未使用它构建生产软件。(.NET 和 Javascript 是我的生计。)显然,在 C 语言中需要free()记忆malloc()是至关重要的。如果您可以在一个例程中同时完成这两项工作,那就太好了。但是随着程序的增长和结构的加深,跟踪什么在malloc哪里被释放以及什么是适合释放的变得越来越难。

我在互联网上环顾四周,只发现了一些通用的建议。我怀疑你们中的一些长期 C 编码员已经提出了自己的模式和实践来简化这个过程并将邪恶放在你面前。

那么:您建议如何构建您的 C 程序以防止动态分配成为内存泄漏?

0 投票
12 回答
56531 浏览

c - 无法在 C 中释放 const 指针

我怎样才能释放一个const char*?我使用 分配了新内存malloc,当我尝试释放它时,我总是收到错误“不兼容的指针类型”

导致这种情况的代码类似于:

0 投票
1 回答
260 浏览

c++ - 如何在 C++ 中分析和捕获双重删除和内存损坏

我有我用 VS 2008 在 windows 7 上用 c++ 编译的应用程序我得到了异常我试图捕捉这个我创建的 pdb 文件(因为我在发布中编译)。并查看堆栈的一部分,但它没有给我提示错误在哪里。我正在寻找免费的方法来获得这个错误。你能推荐免费的方法来做到这一点吗?

0 投票
9 回答
326343 浏览

c++ - 如何追踪“双重免费或损坏”错误

当我运行我的(C++)程序时,它会因这个错误而崩溃。

* 检测到 glibc * ./load: 双重释放或损坏 (!prev): 0x0000000000c6ed50 ***

如何追踪错误?

我尝试使用 print ( std::cout) 语句,但没有成功。可以gdb让这更容易吗?

0 投票
0 回答
248 浏览

c - 在 C 中,由于 free() 知道数组大小,为什么没有获取数组大小的函数?

可能重复:
如果 free() 知道我的数组的长度,为什么我不能在我自己的代码中要求它?

环顾四周(包括在stackoverflow),我发现 malloc() 分配了一个数组并创建了一个标头来控制数组信息。

在此标头中,还有数组大小。free() 使用这些信息来了解如何释放该数组。

那么,如果数组大小信息在“那里”(在内存中的某个位置),为什么没有返回数组大小的函数,在数组头中寻找它?还是我错过了什么?

0 投票
2 回答
3120 浏览

c - 在 C 中,是否可以只释放数组的第一个或最后一个位置?

我有一个数组,但我不需要它的第一个(或最后一个)位置。所以我将一个新变量指向数组的其余部分,但我应该释放数组的第一个/最后一个位置。例如:

否则我必须将数组 memcpy 到其他变量,不包括第一个位置,然后释放原始数组。像这样:

但是,我将有复制所有数组的开销。

这是否可以只释放数组的一个位置?

0 投票
1 回答
3075 浏览

c - 在 Solaris/Linux 中释放分配的内存

我写了一个小程序并在 Solaris/Linux 平台下编译它来衡量将这段代码应用到我的应用程序的性能。

该程序是这样编写的,最初使用sbrk(0)系统调用,我取了堆区域的基地址。之后我使用系统调用分配了 1.5 GB 的内存malloc,然后我使用memcpy系统调用将 1.5 GB 的内容复制到分配的内存区域。然后,我释放了分配的内存。

释放后,我sbrk(0)再次使用系统调用查看堆大小。

这是我有点困惑的地方。在 Solaris 中,即使我释放了分配的内存(接近 1.5 GB),进程的堆大小仍然很大。但是我在Linux中运行同样的应用程序,释放后发现进程的堆大小等于分配1.5 GB之前的堆内存大小。

我知道 Solaris 不会立即释放内存,但我不知道如何调整 Solaris 内核以在free()系统调用后立即释放内存。

为什么我在Linux下没有同样的问题?

0 投票
7 回答
751 浏览

c - 为什么 C 中释放的结构仍然有数据?

当我运行此代码时:

我仍然得到

虽然我已经释放了食物。为什么是这样?内存真的释放了吗?

0 投票
5 回答
2558 浏览

c++ - C 等价于 C++ delete[] (char *)

C++ 的 C 等价物是什么

编辑:我正在将一些 C++ 代码转换为 ANSI C。它有:

这对C 有用吗?

0 投票
4 回答
1052 浏览

c - 为什么没有内存泄漏?

以下旨在获取可变长度的常量 char 并以良好的格式打印出来以进行日志记录。我相信读者会对如何改进这一点提出建议,我很欢迎。

令我困惑的是,我预计每次调用 ToHexString() 时都需要 free() 返回的静态字符。相反,我没有看到任何内存泄漏。即使我使用内联函数,因此也不会将其返回值分配给变量。

我创建了一个简单的测试,在循环中调用这个函数,每次都使用不同长度的 cString 和 nMaxChars 参数。然后我查看了VM状态。我的测试程序的内存分配和可用内存从未改变。

在我看来,每次调用 malloc 并且没有空闲时它应该增加。

这是调用例程: