使用free()时的分段错误
此代码导致分段错误:
int main(){ char *p; char a[50] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; p = (char *)malloc(50*sizeof(char)); if(!p){ cout << "Allocation Failure"; cout << "\n"; } else{ cout << "Allocation Success"; cout << "\n"; p = a; cout << p; cout << "\n"; free(p); } return 0; }
执行该程序后的输出是:
Allocation Success aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Segmentation fault
我无法找到错误。 可能是什么原因?
你在一块没有使用malloc
方法分配的内存块上调用free
。
当你这样做时: p = a
你将p
分配给堆栈数组a
使用的内存。 该内存未使用malloc
分配,因此无法使用free
释放。
此外,通过重新分配,您将无法跟踪最初使用malloc
分配并分配给p
,从而导致内存泄漏。
这个:
p = a;
复制指针 ,而不是指向内存的内容。 p
现在指向数组a
的第一个元素。 因此,当你执行free(p)
,你试图释放一个非动态数组,这没有任何意义。 1
您应该调查strncpy()
来复制字符串。
它还会导致内存泄漏。
char a[50]
在堆栈上分配一个包含50个字符的数组。 因此,指向堆栈上的地址。
p = a
将p设置为指向与a相同的地址。 因此,在p = a
,p指向堆栈上的地址。 请记住, p包含一个地址 。
之后, free(p)
尝试释放堆栈上的内存区域,这是非法的。 你只能释放你从malloc()获得的内存。
你实际上是指memcpy(p,a,50); 不是p = a,记住C没有字符串数据类型。
p = a; // p points a
执行此行,p应该指向const string( char *
)。 你不能free()
通过调用malloc
或calloc
无法获得的任何东西。 因为在这个例子中你试图free()
一个const字符串,你会收到一个错误。