私はバイナリモードでファイルに保存し、次のクラスがあります:asd
ポインタの内容はに印刷されているプログラム終了時に私の新しい割り当てポインタが自動的に削除されるのはなぜですか?
int main()
{
{
lol kar;
kar.age = 17;
kar.name = "Blabla";
ytxt("class").Write(std::string((char*)&kar, sizeof(kar))); //Saves the class in binary mode
}
lol * asd;
{
std::string stClass = ytxt("class").Read();//reads the file in binary
asd = (lol*)new char[stClass.length()];//asd is now allocated with new
memcpy_s(asd, stClass.length(), stClass.c_str(), stClass.length());//copy the content of the file into the class
}
std::cout << "Name: " << asd->name << std::endl;//output
std::cout << "Age: " << asd->age << std::endl;
asd->age = 79;
std::cout << "Age: " << asd->age << std::endl;
delete asd;//I cannot delete it as lol
//delete (char*)asd;//works but lol destructor is not called
system("pause");
}
:私はこれを持っている私のメインに今
class lol
{
public:
~lol() {
std::cout << "destucted" << std::endl;
system("pause");
}
int age;
std::string name;
};
をコンソールでは、ポインタが削除され、デストラクタが呼び出されます。最後に例外がスローされます。
asd
ポインタを削除しないと、すべて正常に動作していますが、asd
ポインタのデストラクタが呼び出されません。私はポインタがnew char
として割り当てられていると私はそれをnew char
として削除する必要があることを知っているが、削除操作がlol
のデストラクタを呼び出す別の方法はありますか?
として保存することができます。文字列を正しくシリアル化していますか?または単にポインタをダンプする。 –
なぜオブジェクトを 'new lol()'ではなく 'new char [stClass.length()]'として作成しますか? – GMichael
これは、誰かが非PODタイプを簡単にブロブ管理しようとする場合に、数千もの同様の質問に加わることになります。そして悲しいことは、そうしようとする試みが言葉遣い、タイトル、コードサンプルにばらつきがあることです。何百もの重複のうちの1つを自明に見つけることはほとんど不可能です。 – WhozCraig