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

时间:2014-10-05 03:29:25

标签: 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()元素感到困惑。

2 个答案:

答案 0 :(得分:3)

如果您想使用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()取消分配内存。

答案 1 :(得分:2)

如果要将malloc用于c ++对象, 你必须使用“placement new”:

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