潜在的内存泄漏:块的 Malloc 和部分块的免费?
Potential Mem leak: Malloc for block and free for parts of the block?
我正在处理遗留 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++ 中应该几乎总是只使用 new
/delete
,而不是 malloc
/free
。
我正在处理遗留 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++ 中应该几乎总是只使用 new
/delete
,而不是 malloc
/free
。