2017-01-31 9 views
-2

まず、C++を長時間使用していなかったので、この質問は非常に簡単で、ここに投稿する必要はありません。とにかく、私はここで、または他のソースでは解決策が見つかりませんでした。 私の問題は以下の通りです。我々はクラスAを持っていると仮定しましょう:char配列の初期化とデストラクタ

Class A 
{ 
    char* string; 
public: 
    char*& getString(){ return string; } 
    ~A() 
    { 
     if (string) 
      delete[] string; 
    } 
}; 

私は(それが実際のクラスのほんの一例です)このクラスを変更することはできません。 私は値にフィールドstringを設定したい:

int main() 
{ 
    A a; 
    a.getString() = new char[3]; 
    a.getString() = "Hi\0"; 
    return 0; 
} 

このコード原因デバッグアサート失敗デストラクタ~A()が呼び出されたとき。私はここで間違っていますか? 私が間違っていることについての提案は本当にありがたいです。

編集: ここでは代入演算子が重要です。

int main() 
{ 
    A a; 
    char name[256]; 
    std::cin.getline(name, 256); 

    a.getString() = new char[strlen(name)]; 
    //actual version 
    strcpy_s(a.getString(), strlen(name), name); 
    //a.getString() = "Hi\0"; 
    return 0; 
} 
+4

静的に割り当てられた文字列を '削除 'しようとしています(すべての文字列リテラルが静的に割り当てられています)。 std :: stringを優先し、デストラクタを削除します(std :: stringはRAIIを使用し、自動的にリソースを処理します)。 – Kevin

+0

割り当ては、現在の値に基づいて異なる動作をしません。常に新しい値が割り当てられ、古い値が上書きされます。 – chris

+4

あなたのコードは 'delete [] 'になっています。 'new'で割り当てられていないポインタを' delete'しようとしています。以前の割り当ても漏れています。 –

答えて

0

このコード原因デバッグアサート失敗デストラクタ〜A()が呼び出された:実は、私は、このような割り当てをやっています。私はここで間違っていますか?この行の後

a.getString() = "Hi\0"; 

a.string点リテラル文字列です。デストラクタはポインタ上でdelete[]を呼び出します。文字列リテラルを削除すると、未定義の動作が発生します。また、ポインタが上書きされたため、以前に割り当てられた動的配列がリークされます。

解決方法は、引用符で囲まれた行を削除することです。