3 ms·
class Tree { public: ... ~Tree() { ... ... If you have create a non-final class with a public non-virtual destructor, you are basically guara
by mgraczyk 12y ago
class Tree {
public:
...
~Tree() { ...
...
If you have create a non-final class with a public non-virtual destructor, you are basically guaranteed that code using your library will have memory leaks.
:(
- bhangi 12y agoSorry if this is an ignorant question, but can you elaborate on this? It's not clear to me why this would lead to memory leaks.
- gtremper 12y agoThis covers the standard reason http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors http://stackoverflow.com/questions/461203/when-to-use-virtua...
- quizotic 12y agofor example: http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors http://stackoverflow.com/questions/461203/when-to-use-virtua... class B : public A { ... } void foo() { A* someA = new B(...); ... delete someA; } if A destructor is not virtual, then B's resources leak.
- eclipsor 12y agoIf the destructor isn't implemented in derived classes, they will use the parent's destructor. Not a guaranteed memory leak..... but something you need to be aware of.
- nostrademons 12y agoIt's worse than that - if you ever have a a variable with the static type of the base class but the dynamic type of a derived class, memory will leak, even if you've implemented the destructor in derived classes. For example, this code: class Base { public: Base() {} ~Base() {} }; class Derived : public Base { private: Foo* _foo; public: Derived() : _foo(new Foo) {} ~Derived() { delete _foo; } }; int main() { std::unique_ptr<Base>(new Derived); } The problem here is that if the destructor is not marked virtual, then when unique_ptr<Base> goes to invoke the destructor, it calls ~Base instead of ~Derived. That has no knowledge of Derived's member variables, so any memory that Derived allocated leaks. (Technically, it's undefined behavior and can do whatever it wants, but most implementations in practice will call ~Base.)
- cbd1984 12y agoSo this means the code is in C++ and not in C? The title should be more explicit on that. It's like advertising your code is in C++/C#.
- deathanatos 12y ago> So this means the code is in C++ and not in C? The title should be more explicit on that. It's like advertising your code is in C++/C#. It appears to be mixed. The files ending in .c contain C, the files ending in .cpp contain C++. See the Makefile, which will compile each with the relevant compiler. Also, did you reply to the right parent?