实现Node类时出现问题

时间:2013-06-27 20:43:27

标签: c++ pointers constructor

有人可以告诉我以下代码有什么问题吗?我正在努力实施 带有Node类的图,其中包含节点id和指向其邻居的指针向量。这是我的代码的简短版本:

#include<vector>
#include<iostream>

using namespace std;


class N {
public:
    int i;
    vector<N*> v;
    N(int i) {
        this->i = i;
    };
};

int init(N* n1) {
    N n2(2);
    cout << "pointer " << &n2 << endl;
    n1->v.push_back(&n2);
};

int main() {
    N n1(1);
    init(&n1);
    cout << n1.i << endl;
    cout << "pointer " << n1.v[0] << endl;
    cout << n1.v.at(0)->i << endl;
    return 0;
};

问题是在调用init函数之后,似乎节点n2不再存在。

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

因为n2是局部变量,它将在init函数调用之后释放。因此,在init函数调用之后,内容驻留在其先前的地址中是未定义的。

要解决此问题,请考虑使用new运算符:

int init(N* n1) {
    N* n2 = new N(2);
    cout << "pointer " << n2 << endl;
    n1->v.push_back(n2);
};

或者只是

int init(N* n1) {
    n1->v.push_back(new N(2));
};

由于您添加的实例是由new运算符创建的,因此您需要使用delete运算符释放内存(例如,在N的析构函数中):< / p>

~N() {
  for (int i = 0; i < v.size(); ++i) {
    delete v[i];
  }
  v.clear();
}

答案 1 :(得分:1)

int init(N* n1) {
    N n2(2);
    cout << "pointer " << &n2 << endl;
    n1->v.push_back(&n2);

} // life time of n2 ends here

n2驻留在堆栈上。一旦init返回,它的生命周期就会结束。因此,引用它会导致未定义的行为。试试 -

n1->v.push_back(new N(2));

答案 2 :(得分:1)

您需要了解范围。 n2在函数init

结尾处超出范围(因此其内存地址)