潜在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]);
}

事实上,它在真实的代码中更令人困惑,但我认为我已经抓住了它的本质

我的问题是:这是内存泄漏吗?

这不是内存泄漏。这是更糟糕的、未定义的行为。

只能对从malloc(或calloc等(返回的指针调用free。不允许对指向返回存储块中其他位置的指针调用free。这样做会导致未定义的行为。


此外,更迂腐的是,malloc不创建任何对象,指针算术要求指针指向数组对象的元素,以便它在C++中具有定义良好的行为。因此,从技术上讲,当你进行时,你已经有了未定义的行为

buffer + j*N_floats_per_buffer

尽管可能所有编译器的行为都符合预期(即使标准没有做出任何保证(。这一问题最近才在C++20中得到解决,在C++20中将隐式创建所需的数组。

在C++中,应该几乎总是只使用new/delete,而不是malloc/free

相关内容

  • 没有找到相关文章

最新更新