我想知道是否可以免费使用char *
分配calloc
(字符串),但有几次。
char * signal;
for (int i = 0 ; i < n ; i++) {
signal = (char*) calloc(n, sizeof(char));
if (a = true) {
signal[i] = 1;
}
/* do stuff */
free(signal); /* error here : double free or corruption */
}
为什么我会在free()
上收到错误?
答案 0 :(得分:1)
想知道是否可以释放一个用calloc分配的char *(字符串),但是几次。
简答:否
答案很长:打电话给malloc()
,calloc()
,realloc(NULL, ...)
(* 1)允许(需要,不要泄漏内存)一个调用free()
将值传递给后者,由前者之一返回。
因此,如果将已经free()
的ed地址传递给free()
并假设在上一次调用free()
之后没有被另一个分配返回,那么代码会调用未定义的行为,从那时起,任何事都会发生。
(* 1)关于realloc()
的注释:
realloc()
未传递NULL
的连续调用不会增加对free()
的必要调用总和。换句话说
char * p = malloc(42);
p = realloc(43);
只需要一次调用free()
free(p);
将NULL
传递给realloc()
会使realloc()
计为对malloc()
的调用。
否则
char * p = realloc(NULL, 42);
与做
相同char * p = malloc(42);
答案 1 :(得分:0)
内部malloc
和calloc
都应该做同样的事情来分配内存(正如realloc
所做的那样)。唯一的区别是memset
中对calloc
的调用。因此,如果您想避免内存泄漏,那么您使用calloc
分配的内存必须传递给free
。
答案 2 :(得分:0)
只有一个C函数用于释放动态分配的内存。该函数为Bootstrap-3-Typeahead,它可以,应该而且必须用于释放使用free()
,malloc()
或calloc()
分配的任何内存块。
您发布的代码似乎没问题。如果你的内存损坏,则来自你没有发布的代码。
答案 3 :(得分:0)
以下提议的代码
现在是代码
#include <stdlib.h> // calloc(), free()
int main( void )
{
char * signal;
size_t n = 10;
int a = 1;
for (size_t i = 0 ; i < n ; i++)
{
signal = calloc(n, sizeof(char));
if (a)
{
signal[i] = 1;
}
/* do stuff */
free(signal); /* error here : double free or corruption */
}
}
这表示您遇到的问题是由do stuff
区域中的某些内容造成的。
我要看的一件事是:检查signal
中的任何'索引'是否永远不会低于0并且永远不会超过n-1
,因为任何一个错误都会破坏堆。损坏的堆(通常)会导致对free()
的调用失败。
同时检查指针signal
的内容是否永远不会被do stuff
更改,因为这也会导致调用free()
失败。