You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:50:30