0

次のクラスはメンバー変数newTodayTaskString( string) で開始されます。

オブジェクトを破棄するときに文字列を削除したいのですが、プロジェクトをコンパイルすると、デストラクタの削除行を指すエラー メッセージが表示されます。

削除: std::string は void に変換できません

クラス:

class TodayTask {
private:   
    string newTodayTaskString;

public: 
    TodayTask (string t) : newTodayTaskString (t){}

    // Destr.
    ~TodayTask () {
        delete newTodayTaskString;
    }

    string getTodayTaskString () const {
        return newTodayTaskString;
    }
};
4

7 に答える 7

4

deleteポインタを指定する必要があり、 で作成されたオブジェクトを破棄するためにのみ使用できますnew

この場合、オブジェクトはクラス メンバーであるため、自動的に破棄されます。デストラクタで何もする必要はありません。

于 2012-07-05T10:54:37.767 に答える
3

C++ では、メモリは自動または手動で割り当てることができます。単純な変数を定義すると、そのメモリは自動的にStackに割り当てられます。その後、メモリは自動的に解放されます。例えば:

void foo()
{
    std::string s;//memory is allocated here
}//the variable only lives inside the function, so at this point the memory is freed

2 番目の方法は、次のようにnew 演算子を使用して手動でメモリを割り当てることです。

void foo()
{
    int * i = new int();//we allocate the memory for our variable here.
}

ここで、メモリはヒープに割り当てられ、プログラムが終了するまで、関数の最後または他の場所で自動的に解放されません。この場合、operator deleteを呼び出す必要がありますが、変数ごとに1 回だけ呼び出す必要があります。

void foo()
{
    int * i = new int();
    <...some code...>
    delete i;//we free the memory at this point.
}

同じ変数を 2 回削除しようとすると、セグメンテーション違反が発生する可能性があることに注意してください。

あなたの場合、メモリを手動で割り当てていない変数を手動で削除しようとしているため、エラーが発生します。あなたの場合、デストラクタを気にする必要はありません。すべてが自動的に行われます。

于 2012-07-05T10:52:42.050 に答える
2

deleteを使用してオブジェクトを作成する場合にのみ必要ですnew。この場合、オブジェクトはメンバー変数であるため、コンストラクターの前に自動的に作成されます。したがって、デストラクタが呼び出された後、自動的に破棄されます。

于 2012-07-05T10:54:37.123 に答える
2

deleteを使用して作成した場合にのみ使用する必要がありますnew

于 2012-07-05T10:49:05.400 に答える
1

「new」で割り当てられていないため、newTodayTaskString を「削除」しません。これはメンバー変数です。自動的に構築および破棄されるため、何もする必要はありません。

于 2012-07-05T10:47:33.657 に答える
0

文字列を削除する必要はありません。動的に割り当てられません。

これだけ覚えておいてください: 新しいものを作成するときは削除を使用してください。何かの配列を新しく作成するときは、delete[] を使用します。

于 2012-07-05T11:09:32.327 に答える
0

newTodayTaskStringメモリを割り当てるのはあなたではないので、削除する必要はありません

于 2012-07-05T10:47:42.687 に答える