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

Why would <list> element cause segmentation fault in an object using memory from malloc()

本文关键字:对象 内存 错误 分割 gt list lt 元素 为什么 malloc      更新时间:2023-10-16

我有一个(简化的)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()没有初始化元素。但是,在使用malloc()时,我仍然对如何初始化<list>元素感到困惑。

如果要使用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++对象使用malloc,你必须使用"放置新的":

void *p = malloc( sizeof(node) );
node* node1 = new (p) node;
node1->iplist.push_back(10);