我目前有一个struct p,它包含另一个名为pg的结构的向量。 这是进程结构:
struct p{
int i;
int s;
vector<pg*> pT;
void addP(struct pg* nP){
pT.push_back(nP);
}
};
程序中的其他地方,我通过执行以下操作创建一个新的p结构:
struct p *p1= (struct p*) malloc(sizeof(struct p));
然后为id和size分配值。 我想在struct的pT向量中添加一个新页面。所以我决定我可以做p1-&gt; addP(makeP()),其中makePreturns指向pg结构的指针,pg *。
这是一个指向gdb在segfaults时出现的内容的链接。它还提到它正在push_back线上发生。 http://imgur.com/KZOGnI9
指针有问题吗?或者我没有为矢量正确分配内存?
答案 0 :(得分:6)
在C ++中使用malloc
几乎总是一个坏主意。在您的情况下,这导致struct process
的构造函数未被调用,这反过来意味着其成员pageTable
的构造函数也未被调用。
因此,您在未初始化的向量上调用push_back
,导致未定义的行为(在您的情况下,崩溃)。
malloc
可能只适用于&#34;普通的旧数据类型&#34;,即不需要任何构造的类型(只有一个默认构造函数,只有普通的旧数据类型作为成员)。
在C ++中在堆上分配对象的正确方法是使用new
,如下所示:
process *p = new process; // possibly add constructor arguments here
更好的方法是使用智能指针,例如std::unique_ptr
,或者,如果需要共享所有权,则std::shared_ptr
。
甚至更好的方法是根本不使用指针,特别是对于你的向量中的对象,但也可能对你的struct process
。只有在必要时才使用它们!
答案 1 :(得分:2)
malloc
process
对象不正确,因为malloc
不会调用结构的构造函数,而构造函数调用std::vector<page*>
的构造函数。
如果可能,请将process
设为普通自动对象:
process proc;
如果您确实需要动态分配,请使用new
代替malloc
:
process* proc = new process;