use*_*941 0 c++ struct pointers vector
我目前有一个struct p,它包含另一个名为pg的结构的向量.这是进程结构:
struct p{
int i;
int s;
vector<pg*> pT;
void addP(struct pg* nP){
pT.push_back(nP);
}
Run Code Online (Sandbox Code Playgroud)
};
在程序的其他地方,我创建了一个新的p结构:
struct p *p1= (struct p*) malloc(sizeof(struct p));
Run Code Online (Sandbox Code Playgroud)
然后为id和size分配值.我想在struct的pT向量中添加一个新页面.所以我决定我可以做p1-> addP(makeP()),其中makePreturns指向pg结构的指针,pg*.
这是一个链接到gdb在segfaults时显示的内容.它还提到它正在push_back线上发生. http://imgur.com/KZOGnI9
指针有问题吗?或者我没有为矢量正确分配内存?
使用mallocC++中几乎总是一个坏主意.在你的情况下,这会导致struct process未被调用的构造函数,这反过来意味着它的成员的构造函数pageTable也不会被调用.
因此,您正在调用push_back未初始化的向量,从而导致未定义的行为(在您的情况下,崩溃).
malloc 可能只适用于"普通旧数据类型",即不需要任何构造的类型(只有一个默认构造函数,只有普通的旧数据类型作为成员).
在C++中使用堆栈分配对象的正确方法是使用new,如下所示:
process *p = new process; // possibly add constructor arguments here
Run Code Online (Sandbox Code Playgroud)
更好的方法是使用智能指针std::unique_ptr,如果需要共享所有权,则使用或std::shared_ptr.
一个甚至更好的方法是根本不使用指针,特别是对物体在您的载体,但也可能为你的struct process.只有在必要时才使用它们!
| 归档时间: |
|
| 查看次数: |
615 次 |
| 最近记录: |