The following code crashes, raising std::bad_alloc
or sometimes std::logic_error
.
#include <string>
class Crasher {
public:
Crasher() : value(default_value) {}
private:
std::string value;
const std::string default_value = "default is yours";
};
int main(void) {
Crasher();
}
I believe the reason is that the members are initialized out of order, and when value
is being intialized in initializer list, default_value
hasn't yet been initialized.
However, I don't get any compiler warnings or errors with -Wall
enabled. However if I change value
and default_value
to a POD type like int
, then I get a warning from g++
:
$ g++ -Wall crasher.cpp
crasher2.cpp: In constructor ‘Crasher::Crasher()’:
crasher2.cpp:5:23: warning: ‘*<unknown>.Crasher::default_value’ is used uninitialized in this function [-Wuninitialized]
5 | Crasher() : value(default_value) {}
|
Why do I not get a warning when the type is std::string
? Is this a compiler problem, or a quirk of the language?
Aucun commentaire:
Enregistrer un commentaire