c++ - 潜在的 Mem 泄漏:块的 Malloc 和部分块的免费?
问题描述
我正在使用遗留 C++ 代码,该代码使用 malloc 保留一块内存并将其分成单独释放的部分。像这样的东西:
const int N_floats_per_buffer = 100;
const int N_buffers = 2;
//reserve buffers en bloque
float * buffer = (float*) malloc(N_float_per_buffer * N_buffers * sizeof(float));
//then this block memory is divided into sub-blocks
float * sub_buffer[N_buffers];
for(int j = 0; j < N_buffers; ++j)
{
sub_buffer[j] = buffer + j*N_floats_per_buffer;
}
//do something with the buffers...
//...
//finally: memory is freed for the individual buffers
for(int j = 0; j < N_buffers; ++j)
{
if(sub_buffer[i]!=NULL) free(sub_buffer[j]);
}
它实际上在真实代码中更加令人困惑,但我认为我已经抓住了它的本质。
我的问题是:这是内存泄漏吗?
解决方案
这不是内存泄漏。更糟糕的是,未定义的行为。
您只能调用free
从malloc
(或calloc
等)返回的指针。不允许调用free
指向返回存储块中其他位置的指针。这样做会导致未定义的行为。
同样在更迂腐的一面,malloc
它不创建任何对象,并且指针算术要求指针指向数组对象的元素,以便它在 C++ 中具有明确定义的行为。因此,当您这样做时,您在技术上已经有未定义的行为
buffer + j*N_floats_per_buffer
尽管可能所有编译器的行为都符合预期(尽管标准没有做出任何保证)。这最近才在 C++20 中得到解决,其中所需的数组将被隐式创建。
在 C++ 中几乎总是只使用new
/ delete
,而不是malloc
/ 。free
推荐阅读
- r - R 等效于 SAS put 语句
- python - VisualCode - 浮点对象不可迭代
- java - 为什么要在 Docker 中运行 JVM 进程
- amazon-web-services - 如何关系化包含数组的 JSON
- javascript - 根据文本选择选择选项
- jquery - jquery插件的优化
- jquery - 如何使用 jquery 在同一行显示来自 json_encode 数组的两个值?
- go - golang RFC3339Nano 时间戳可以可靠地转换为 Unix 时间戳吗?
- c - 如何读取输入文件并将整数存储到C中的数组中
- ruby-on-rails - 如何在测试之前停止 Rspec 删除测试数据库