潜在Mem泄漏:Malloc适用于阀块,而自由适用于阀块零件? 我使用遗留的C++代码工作,使用MALOC保留一块内存,并将其划分为单独释放的部分。大概是这样的: 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]); } const int N_float_per_buffer=100; 常量int N_缓冲区=2; //整体储备 float*buffer=(float*)malloc(N_float_per_buffer*N_buffers*sizeof(float)); //然后将该块内存划分为子块 浮点*子_缓冲区[N_缓冲区]; 对于(int j=0;j < > />代码>删除< />代码>,而不是 MalcC++ /免费> />代码> .

潜在Mem泄漏:Malloc适用于阀块,而自由适用于阀块零件? 我使用遗留的C++代码工作,使用MALOC保留一块内存,并将其划分为单独释放的部分。大概是这样的: 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]); } const int N_float_per_buffer=100; 常量int N_缓冲区=2; //整体储备 float*buffer=(float*)malloc(N_float_per_buffer*N_buffers*sizeof(float)); //然后将该块内存划分为子块 浮点*子_缓冲区[N_缓冲区]; 对于(int j=0;j < > />代码>删除< />代码>,而不是 MalcC++ /免费> />代码> .,c++,memory-leaks,malloc,free,C++,Memory Leaks,Malloc,Free,在实际代码中,它实际上更令人困惑,但我想我已经抓住了它的本质 我的问题是:这是内存泄漏吗?这不是内存泄漏。这是更糟糕的,未定义的行为 只能对从malloc(或calloc等)返回的指针调用free。不允许对指向返回存储块中其他位置的指针调用free。这样做会导致未定义的行为 另外,在一个更迂腐的方面,MalOC不创建任何对象,指针运算需要指针指向数组对象的元素,以便在C++中具有明确的行为。因此,从技术上讲,当您这样做时,您已经有了未定义的行为 buffer + j*N_floats_per_

在实际代码中,它实际上更令人困惑,但我想我已经抓住了它的本质


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

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

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


另外,在一个更迂腐的方面,MalOC不创建任何对象,指针运算需要指针指向数组对象的元素,以便在C++中具有明确的行为。因此,从技术上讲,当您这样做时,您已经有了未定义的行为

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


<> >几乎不应该总是使用<代码> > < <代码> > />代码>删除< />代码>,而不是<代码> MalcC++ <代码> /<代码>免费> />代码> .

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

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


另外,在一个更迂腐的方面,MalOC不创建任何对象,指针运算需要指针指向数组对象的元素,以便在C++中具有明确的行为。因此,从技术上讲,当您这样做时,您已经有了未定义的行为

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


几乎总是只使用C++代码>删除< <代码> >,而不是<代码> MalcC < /> > /<代码>免费> />代码> <>代码>免费> <代码>:您只能“代码>免费< /代码> >您的代码> Malc C <代码> ED(<代码> CaloC ED,<代码> STRUP ED,…)。您的

sub_缓冲区
s是指向现有内存的指针,而不是指向已分配内存的句柄。但是你应该
free(buffer)
当你完成时。@walnut我已经删除了C标记,因为代码是用MSVC版本1900编译的。关于可变长度数组:我输入错误,忘记了整数长度变量前面的const。我在编辑中更正了它。这就是你的意思吗?@geo是的,这就是我的意思
const
解决了它,是的。它是
free
的无效用法:你只能
free
你所拥有的
malloc
ed(
calloc
ed,
strdup
ed,…)。您的
sub_缓冲区
s是指向现有内存的指针,而不是指向已分配内存的句柄。但是你应该
free(buffer)
当你完成时。@walnut我已经删除了C标记,因为代码是用MSVC版本1900编译的。关于可变长度数组:我输入错误,忘记了整数长度变量前面的const。我在编辑中更正了它。这就是你的意思吗?@geo是的,这就是我的意思
const
解决了这个问题,是的。我刚刚在cppreference()上读到了关于“免费”的内容。它说:“如果ptr的值不等于malloc()、calloc()、realloc()或aligned_alloc()(从C11开始)之前返回的值,则行为是未定义的。”这绝对也是您所说的。我唯一想知道的是(从C11开始)附件。这是否意味着在C11之前,它不是未定义的行为?还有一个问题:如果仅释放数组的第0个元素,它是否也是未定义的行为:free(sub_buffer[0])在这种情况下,它将指向malloc分配的块,还是不?(我知道这仍然是可怕的代码)@地理信息首先,你应该看看C++版本的页面,如果你正在编写C++代码:“(自C11起)”注释仅适用于“或对齐的_alloc()”零件。(文本周围应该有一个框来表示这一点)。这是因为
aligned\u alloc()
仅使用C11添加到C标准中。在以前的迭代中,它不存在。句子的其余部分始终适用。在C++页面上,你会看到C++的等价物。@ GEO,如果你只释放代码>子缓冲区[0 ] < /代码>(并且只有一次),那么就没有问题。code>sub_buffer[0]指向与从
malloc
返回的指针相同的地址。在
空闲
上不会有未定义的行为,在这种情况下也不会有任何内存泄漏。我关于指针算术未定义行为的另一个注释仍然适用,但这并不是一个实际问题。它说:“如果ptr的值不等于malloc()、calloc()、realloc()或aligned_alloc()(从C11开始)之前返回的值,则行为是未定义的。”这绝对也是您所说的。我唯一想知道的是(从C11开始)附件。这是否意味着在C11之前,它不是未定义的行为