c++ - 为什么 <list> 元素会在使用 malloc() 内存的对象中导致段错误

标签 c++ malloc new-operator dynamic-memory-allocation

我有这个(简化的)C++ 类:

class node{
public:
    int num;
    list<int> iplist;   
};

然后我为其动态分配内存:

node* node1 = (node*) malloc( sizeof(node) );

使用node1->num就可以了,完全没问题。然而,(node1->iplist).push_back(10)会造成段错误。我把它改回:

node* node1 = new node;

它再次正常工作,包括 (node1->iplist).push_back(10) 。 我用谷歌搜索答案,意识到这可能是因为 malloc()不初始化该元素。但是,我仍然对如何初始化 <list> 感到困惑使用 malloc() 时的元素.

最佳答案

如果你想使用malloc()来分配你的对象,最可靠的方法是为你的对象重载new运算符。

class node{
public:
    int num;
    std::list<int> iplist;

    void * operator new (size_t sz) { return malloc(sz); }
    void operator delete (void *p) { free(p); }
    void * operator new[] (size_t sz) { return malloc(sz); }
    void operator delete[] (void *p) { free(p); }
};

通过这些重载,使用 newnew[] 将导致调用 malloc() 来获取动态内存分配请求。对 deletedelete[] 的调用将使用 free() 来释放内存。

关于c++ - 为什么 <list> 元素会在使用 malloc() 内存的对象中导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26199369/

相关文章:

c++ - 将分区转换为 vhd Windows API

c - 哪种方式为字符串保留内存?

c++ - 在堆中创建数组并使用/不使用 shared_ptr 删除它时崩溃

c++ - 为什么 Base *pd = new Derived;产生错误?

C++ 无法理解的崩溃行为

c++ - 目标 'Project1.exe' 的配方失败

C++ 头文件交叉 #include

c - 在 C 中释放二维数组

c - Linux内存布局(C中使用的malloc(),但不是以预期地址开始)

c++ - 手动抛出 std::bad_alloc 可以吗?