【发布时间】:2014-10-05 03:29:25
【问题描述】:
我有这个(简化的)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不运行构造函数。您的程序表现出未定义的行为,通过使用一块未初始化的内存,就好像它是一个有效的、完全构造的node实例一样。为什么你首先要使用malloc? -
不要在 C++ 代码中使用
malloc。 -
“但我仍然对使用 malloc 时如何初始化元素感到困惑” 你不应该那样做,这本质上就是
new的用途。现代 C++ 甚至禁止使用new以支持make_unique和make_shared。如果必须将内存分配与初始化分开,则必须使用placement-new手动调用构造函数:node* node1 = static_cast<node*>(malloc(sizeof(node))); new(static_cast<void*>(node1)) node();(包括<memory>)。 -
关于这个问题的 许多 个重复项:"Accessing member of a C++ object allocated with malloc?"
-
@IgorTandetnik 因为我使用 C 而不是 C++,所以我只想在 C++ 中尝试一下,然后我遇到了这个问题。
标签: c++ malloc new-operator dynamic-memory-allocation