-4

我想知道我的 C++ 文件中的类。我确实有一个名为“node”的类和一个名为“edge”的类。在此类节点中是这样的方法:

Edge calculateEdgeTo(Node&);

然后是具有以下操作的主文件:

Node* n1 = new Node(...);
Node* n2 = new Node(...);

delete n1;
delete n2;

这有效..但如果我:

Node* n1 = new Node(...);
Node* n2 = new Node(...);

Edge e = n1->calculateEdgeTo(*n2);

delete n1;
delete n2;

我遇到了分段错误(我认为 n1 已经被释放)。如果我尝试在 n1 上执行其他操作,它也不起作用......总是一个分段错误。

编辑:

这是函数的代码:

Edge Node::calculateEdgeTo(Node& node){
    return new Edge((*this), (*this));
}

和边缘的构造函数:

Edge::Edge(const Node& src, const Node& tar){
    this->src = &src;
    this->tar = &tar;
}

而 src 和 tar 是节点上的指针。

编辑结束。

为什么 n1 从系统中释放出来?我怎么能强迫它不这样做?

亚历克斯

4

1 回答 1

1

不,C++ 不会“自动释放”对象。只有当您调用它们时,它们才会被删除delete

您的代码崩溃的一些可能原因可能是:

  • 你的calculateEdgeTo函数一定是做错了什么,这会产生你的段错误,而不是被释放的对象。

  • 当您n2通过do 取消引用*n2然后将其传递给 时calculateEdgeTo,您必须确保将正确的数据从中n2复制到函数Node中使用的数据中calculateEdgeTo。您需要编写复制构造函数以确保其有效。

于 2012-10-28T15:43:58.813 回答