解除分配内存的分段错误 [已关闭]

Segmentation Fault to Deallocate the Memory [closed]

提问人:Meteorite 提问时间:12/26/2022 最后编辑:ZarakshRMeteorite 更新时间:12/26/2022 访问量:236

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

11个月前关闭。

由于以下代码中的 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
C++ 分段错误 malloc memcpy

评论

4赞 heap underrun 12/26/2022
在 C++ 中,不要使用 /。也避免使用 /。请改用。mallocfreenewdeletestd::vector
3赞 Sam Varshavchik 12/26/2022
哪本 C++ 教科书教你使用 C++ 代码?你应该扔掉这本教科书,买一本更好的教科书。从来没有一个正当的理由来使用,在 C++ 中,这是用 C 编写的代码,一种完全不同的语言。虽然这里的问题相当简单,但它的出现是因为完全不必要地使用 和 。避免 C++ 中错误的最佳方法是使它们在逻辑上不可能发生。从逻辑上讲,如果根本没有使用它们,就不可能有一个涉及的错误。mallocfreemallocfreemallocfreemallocfree
0赞 j6t 12/26/2022
将指针上的字节复制到指针上。提示:请注意,我从不说“来自”或“到x指向的记忆”。memcpybuf1_sizebuf1buf2
1赞 273K 12/26/2022
不要用非常不同的语言 C 标记 C++。
0赞 Avi Berger 12/26/2022
请注意,除了其他人所说的之外,在 C++ 中使用 memcpy 也有很大的限制。除非你对这些问题非常清楚和小心,否则不要尝试在 C++ 中使用它。即便如此,你可能也不需要这样做。(诚然,如果您正确使用它,在这种情况下它会起作用。

答:

1赞 pm100 12/26/2022 #1

你的实际问题就在这里

 memcpy(&buf2, &buf1, buf1_size);

你是说

 memcpy(buf2, buf1, buf1_size);

但正如其他人所说,你不能在 C++ 中使用 malloc 或 free,你应该使用 new 和 delete。但是在这个 caese 中,您应该使用 std::vector

编辑。你的 malloc 也错了(感谢 Remy)。你需要

 malloc(sizeof(int) * buf1_size)

评论

0赞 Remy Lebeau 12/26/2022
这不是唯一的问题。这也是错误的。memcpy()malloc()
0赞 pm100 12/26/2022
@RemyLebeau,我错过了
2赞 Remy Lebeau 12/26/2022 #2

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

  • 您没有为数组分配足够的内存来复制数组中的值。您只为 8 个字节分配空间,而不是 8 秒。buf2buf1int

  • 您从错误的源内存地址(参数本身的地址,而不是它指向的数组的地址)复制 8 个字节,而不是 8 秒,并将它们写入错误的目标内存地址(变量本身的地址,而不是它指向的数组的地址),因此您正在损坏内存。intbuf1buf2

请尝试以下操作:

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;
}