0

免責事項: C++ を学習している Java 開発者。

削除された動的オブジェクト内に保持されている文字列を返すとどうなりますか?

これはかなり標準的なデキュー メソッドであり、テンプレート化されたデータ (私のテスト ケースでは文字列) へのポインターを使用せずに機能させたいと考えています。

Ubuntu 13.04 の g++ で segfault が発生します。最新の OSX で、データが破損しています。

それは私のコードですか、それとも C++ ですか?

// remove an object from the front of the queue.
// the test case instantiate T as string. 
// front->data is assigned an static string.
template<class T>
T & SomeQueue<T>::dequeue() {
    if (empty()) throw runtime_error("kaboom");

    T tmp = front->data;
    Node<T> *n = front;
    front = front->next;
    delete n;

    return tmp;
};
4

3 に答える 3

4

ジョンが言うように、削除されたオブジェクトのコピーは問題ありません。ローカル変数 ( ) への参照を返すため、クラッシュしますtmp。関数が戻ると、このオブジェクトはもう存在しないため、使用できません。参照ではなく、オブジェクトのコピーを返すように変更T & SomeQueue<T>::dequeueします。T SomeQueue<T>::dequeueT

(そして、コンパイル時に警告を有効にすると、ほとんどのコンパイラはこの種のことについて教えてくれます)。

于 2013-10-05T07:56:36.707 に答える
3

オブジェクトを削除する前に文字列をコピーしたので、このコードは問題ありません。セグメンテーション違反の原因は別のものです。

修正:

問題はここにあります

template<class T>
T & SomeQueue<T>::dequeue() {

する必要があります

template<class T>
T SomeQueue<T>::dequeue() {

ローカル変数への参照を返さないでください。ローカル変数は破棄されます。これが、破棄されたものへの参照を提供しているものです。

于 2013-10-05T07:55:02.490 に答える
3

そのコードは問題ありません。segfault の理由は、関数の終了時に破棄されるローカル変数への参照を返しているためです。

T tmp = front->data;
Node<T> *n = front;
front = front->next;
delete n;

return tmp; //tmp is a local variable here. You are returning a reference (T&)
于 2013-10-05T07:56:45.740 に答える