我有一个(简化的)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); }
};
对于这些过载,使用new
或new[]
将导致对malloc()
的调用,以获取动态分配请求的内存。对delete
和delete[]
的调用将使用free()
来解除分配内存。
如果您想对c++对象使用malloc,你必须使用"放置新的":
void *p = malloc( sizeof(node) );
node* node1 = new (p) node;
node1->iplist.push_back(10);