无法正确推回struct C ++中的向量

时间:2016-03-31 16:44:59

标签: c++ pointers vector struct

我目前有一个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

指针有问题吗?或者我没有为矢量正确分配内存?

2 个答案:

答案 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;