関数内で使用する文字列リテラルは自動変数ですか? それとも、手動で解放する必要があるヒープに割り当てられていますか?
以下に示すコードのような状況があり、文字列リテラルをクラスのプライベート フィールド (コードで ONE としてマーク) に割り当て、それを後でプログラムで取得して使用します (TWO としてマーク)。スタック内の変数を ONE 内のフィールドに割り当てていますか? この場合、プログラムが十分に小さかったために機能したダングリング ポインターをコードが参照している可能性はありますか?
コンパイルして実行しましたが、問題なく動作しましたが、実際のプログラムでこのようなクラスのフィールドに文字列リテラルを割り当てているときに奇妙なクラッシュが発生し、上記のケースが疑われます。
#include <iostream>
using namespace std;
class MemoryLeak
{
private:
char *s;
public:
MemoryLeak() {}
void store()
{
s = "Storing a string"; // ONE
}
char *retrieve()
{
return s;
}
};
int main()
{
MemoryLeak *obj = new MemoryLeak();
obj->store();
cout << obj->retrieve() << endl; // TWO
delete obj;
return 0;
}
変数「s」をポインターではなくchar配列として宣言する必要がありますか? std::string を使おうと思っているのですが、ちょっと気になるところです。
いつものように、ポインタやヘルプは大歓迎です:)ありがとう。