-4

C++ ファイル内のクラスについて疑問に思います。「ノード」という名前のクラスと「エッジ」という名前のクラスがあります。このクラス ノードには、次のようなメソッドがあります。

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*n2、それを に渡すときcalculateEdgeToは、 からの正しいデータが関数内で使用n2されている にコピーされていることを確認する必要があります。これが機能することを確認するには、コピー コンストラクターを作成する必要があります。NodecalculateEdgeTo

于 2012-10-28T15:43:58.813 に答える