3 ms·
That's not really fair. Thing* thing = new Thing(); thing->DoStuff(); delete thing; is perfectly valid C++ and has been since the invention of the langu
by cgrealy 6y ago
That's not really fair.
Thing* thing = new Thing();
thing->DoStuff();
delete thing;
is perfectly valid C++ and has been since the invention of the language. It's not a good idea, but it is valid.
If, OTOH, you do
Thing* thing=(Thing*)malloc(sizeof(Thing));
free(thing);
the you fully deserve the inevitable world of pain that is coming your way
- jcelerier 6y ago> is perfectly valid C++ we're in 2020. $ clang-tidy -checks='cppcoreguidelines-*' foo.cpp /tmp/foo.cpp:10:3: warning: initializing non-owner 'Thing *' with a newly created 'gsl::owner<>' [cppcoreguidelines-owning-memory] Thing* thing = new Thing(); ^ /tmp/foo.cpp:12:3: warning: deleting a pointer through a type that is not marked 'gsl::owner<>'; consider using a smart pointer instead [cppcoreguidelines-owning-memory] delete thing; ^ /tmp/foo.cpp:10:3: note: variable declared here Thing* thing = new Thing(); ^
- cgrealy 6y agoDoes it compile? Does it run? Yes, therefore it's valid C++. I'm not arguing it's good C++, but saying "C++'s destructor behaviour doesn't work if you don't use C++" in relation to using new and delete is clearly nonsense.
- umanwizard 6y agoThe malloc/free version is perfectly valid C++ too, isn’t it?
- cgrealy 6y agoEh... kind of? I guess it depends on your definition of "valid". Let's say we have: class Thing { public: Thing() { cout << "created" << endl; } ~Thing() { cout << "destroyed" << endl; } }; Assuming the happy path, the new/delete version will be functionally identical to a more correct/idiomatic { auto thing = make_unique<Thing>(); } The malloc/free version won't call the destructor, and therefore doesn't do what a "normal" object would do. It's splitting hairs, I guess, but that's where I'd draw the line.