我有这个(简化的)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); }
};
通过这些重载,使用 new
或 new[]
将导致调用 malloc()
来获取动态内存分配请求。对 delete
和 delete[]
的调用将使用 free()
来释放内存。
关于c++ - 为什么 <list> 元素会在使用 malloc() 内存的对象中导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26199369/