Spójrz na ten kod, który powoduje zakończenie programu bez przechwytywania wyjątku.Dlaczego wyjątki od unique_ptr destructor kończą program?
#include <iostream>
#include <string>
#include <memory>
#include <stdexcept>
using namespace std;
struct test {
~test() noexcept(false) {
throw runtime_error("-my-cool-exception-");
}
};
int main()
{
try {
auto ptr = unique_ptr<test>(new test());
//test t; // this is ok, without unique_ptr<test> it works fine.
}
catch(exception& e) {
cout << "this is not called, the program is aborted";
cout << e.what() << endl;
}
return 0;
}
To pytanie różni się od pytania dotyczącego przepełnienia stosu: throwing exceptions out of destructor.
Różnica polega na tym, że wyjątek nie zostanie przechwycony tylko wtedy, gdy używam unique_ptr<test>
.
można zobaczyć na żywo kodu, edytować i skompilować tutaj http://cpp.sh/9sk5m
Ponieważ 20.10.1.2.2 wymaga, aby usunięcie nie powodowało wyjątków. Naruszasz warunki wstępne biblioteki. –
Mam bibliotekę, która całkowicie od tego zależy, nie mogę jej złamać. Czy istnieje obejście tego problemu? dzięki. – amin
Obejście problemu: napraw bibliotekę, zrób to teraz, zanim [dalej Cię ugryzie] (http://stackoverflow.com/a/130123/3426025). – BeyelerStudios