如何在C++代码中正确使用free()函数避免Segmentation Fault?
解决malloc/free引发的Segmentation Fault问题
你的代码触发段错误的核心原因有两个,下面逐一说明并给出修复方案:
错误1:malloc分配的内存大小不足
你当前用malloc(buf1_size)只分配了buf1_size字节的内存,但buf1是int类型数组,每个元素占sizeof(int)字节(通常为4字节)。分配的内存空间远小于实际需要的容量,后续访问buf2数组时会越界读写,破坏堆内存结构,最终导致free()时触发段错误。
修复方式:计算正确的内存大小,改为:
int* buf2 = (int*)malloc(buf1_size * sizeof(int));
错误2:memcpy的参数使用错误
你写的memcpy(&buf2, &buf1, buf1_size)存在两个问题:
- 第一个参数
&buf2是指向指针变量的地址,不是buf2指向的缓冲区起始地址;第二个参数&buf1同理,传递的是数组指针的地址而非数组本身。 - 第三个参数
buf1_size是元素个数,不是字节数,memcpy需要传入总字节数。
正确的写法应该直接传递数组/指针的起始地址,并计算正确的字节长度:
memcpy(buf2, buf1, buf1_size * sizeof(int));
修复后的完整代码
#include <iostream> #include <cstring> using namespace std; void driver_01(int* buf1, int buf1_size) { // 分配正确大小的内存 int* buf2 = (int*)malloc(buf1_size * sizeof(int)); // 正确拷贝数组内容 memcpy(buf2, buf1, buf1_size * sizeof(int)); int count = 0; for (int i = 0; i < buf1_size; i++) { if (*(buf2 + i) != 0) { count++; } cout << *(buf2 + i) << endl; } cout << "Size of buf2: " << count << endl; free(buf2); // 现在可以安全释放,不会触发段错误 } int main() { int buf1[8] = { 2, 6, 12, 15, 22, 30, 40, 50 }; int buf1_size = sizeof(buf1) / sizeof(buf1[0]); cout << "Size of buf1: " << buf1_size << endl; driver_01(buf1, buf1_size); return 0; }
运行这段修复后的代码,就能正常输出结果且不会触发段错误。
内容的提问来源于stack exchange,提问作者Meteorite
相关产品推荐
相关产品推荐

