2
私はRAIIを使用していて、例えば、メモリがリークしないようにtry
/catch
を使用しています。 、原因std::unique_ptr
でstackunwindingとRAIIを使用してデストラクタが呼び出されないのはなぜですか?
#include <iostream>
using namespace std;
void g(){
throw 5;
}
class Rand{
public:
~Rand(){
cout << "Randomm Destructor called" << endl;
}
int a = 17;
};
void f(){
auto p = std::make_unique<Rand>(); //Should call dtor
Rand* r = new Rand(); //Shouldnt call dtor
cout << p->a << endl; //Prints 17
g();
cout << "This never executes" << endl;
}
int main(){
f();
}
例外がされているため、スタック割り当てられたオブジェクトのデストラクタはthrow
/try
への基本的な保証として呼ばれることべきではありません。ここではC++で実装したものです投げられた? throwから
キャッチブロックがないので、巻き戻しが実行されない可能性があります。メインでgの例外をキャッチしてみてください。 –
@NicholasWilson、巻き戻しが起こらない場合はどうなりますか? * – Bana
例外処理のためにアプリケーションが終了した後、OSはメモリを解放しますが、デストラクタは実行されません。それじゃない? – hrust