c++ 解除内存分配的分段故障[已关闭]

fnvucqvd  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(230)

已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

昨天关门了。
Improve this question
由于以下代码中的free()函数,我收到了分段错误(Segfault)。
如何在此代码中使用free()函数而不接收分段错误?

#include <iostream>
#include <cstring>

using namespace std;

void driver_01(int* buf1, int buf1_size) {

    int* buf2 = (int*)malloc(buf1_size);
    //int* buf2 = new int(buf1_size);
    memcpy(&buf2, &buf1, buf1_size);
    
    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;
}

输出:

Size of buf1: 8
2
6
12
15
22
30
40
50
Size of buf2: 8
Segmentation fault
epggiuax

epggiuax1#

您对malloc()memcpy()的使用都是错误的。

  • 您没有为buf2数组分配足够的内存,无法从buf1数组复制值。您只分配了8个字节的空间,而不是8个int
  • 您正在从错误的源内存地址(buf1参数本身的地址,而不是它所指向的数组的地址)复制8个字节,而不是8个int,并将它们写入错误的目标内存地址(buf2变量本身的地址,而不是它所指向的数组的地址),因此您正在损坏内存。

试试这个:

void driver_01(int* buf1, int buf1_size) {

    int* buf2 = (int*) malloc(sizeof(int) * buf1_size);
    //int* buf2 = new int[buf1_size];
    memcpy(buf2, buf1, sizeof(int) * buf1_size);
    //std::copy_n(buf1, buf1_size, buf2);
  
    int count = 0;
    for (int i = 0; i < buf1_size; i++) {
        if (buf2[i] != 0) {
            ++count;
        }
        cout << buf2[i] << endl;
    }
    /*
    int count = count_if(buf2, buf2 + buf1_size,
        [](int i){ return i != 0; });
    for_each(buf2, buf2 + buf1_size,
        [](int i){ cout << i << endl; });
    */

    cout << "Size of buf2: " << count << endl;

    free(buf2);
    //delete[] buf2;
}
kiz8lqtg

kiz8lqtg2#

你真正的问题在这里

memcpy(&buf2, &buf1, buf1_size);

你是说

memcpy(buf2, buf1, buf1_size);

但是正如其他人所说,你不能在c++中使用malloc或free,你应该使用new和delete。但是在这种情况下你应该使用std::vector
编辑。你的malloc也是错误的(谢谢Remy)。你需要

malloc(sizeof(int) * buf1_size)

相关问题