まず、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;
}
静的に割り当てられた文字列を '削除 'しようとしています(すべての文字列リテラルが静的に割り当てられています)。 std :: stringを優先し、デストラクタを削除します(std :: stringはRAIIを使用し、自動的にリソースを処理します)。 – Kevin
割り当ては、現在の値に基づいて異なる動作をしません。常に新しい値が割り当てられ、古い値が上書きされます。 – chris
あなたのコードは 'delete [] 'になっています。 'new'で割り当てられていないポインタを' delete'しようとしています。以前の割り当ても漏れています。 –