我有这个(简化的)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()
元素感到困惑。
答案 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); }
};
对于这些重载,使用new
或new[]
将导致调用malloc()
以获取动态分配请求的内存。拨打delete
和delete[]
将使用free()
取消分配内存。
答案 1 :(得分:2)
如果要将malloc用于c ++对象, 你必须使用“placement new”:
void *p = malloc( sizeof(node) );
node* node1 = new (p) node;
node1->iplist.push_back(10);