J'ai vu plusieurs bouts de code similaires qui ressemblaient à ceci :
struct MyExcept : std::exception {
explicit MyExcept(const char* m) noexcept : message{m} {}
const char* what() const noexcept override {
return message;
}
const char* message;
};
void foo() {
std::string error;
error += "Some";
error += " Error";
throw MyExcept{error.c_str()};
}
int main() {
try {
foo();
} catch (const MyExcept& e) {
// Is this okay?
std::cout << e.message << std::endl;
}
}
Dans la ligne qui suit le commentaire Is this okay?
nous lisons la chaîne de caractères en style c qui a été allouée dans le fichier foo
en utilisant std::string
. Puisque la chaîne est détruite avec le déroulement de la pile, est-ce un comportement non défini ?
S'il s'agit en effet d'un comportement non défini, que se passe-t-il si nous remplaçons l'élément main
avec celui-ci ?
int main() {
foo();
}
Comme il n'y a pas de catch, le compilateur n'est pas obligé de dérouler la pile, et pourtant de sortir le résultat de what()
dans la console et abandonner le programme. Alors, est-ce que c'est toujours un comportement non défini ?