Last active
March 6, 2019 10:58
-
-
Save ncwhale/38b7ef6ac984c7a3ce5e52c26308de56 to your computer and use it in GitHub Desktop.
When to use virtual destructor.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <sstream> | |
#include <memory> | |
class A { | |
public: | |
A() { | |
std::ostringstream oss; | |
oss << "Constructor A@" << std::hex << (void *)this << "\n"; | |
std::cout << oss.str() << std::flush; | |
} | |
~A() { | |
std::ostringstream oss; | |
oss << "Destructor A@" << std::hex << (void *)this << "\n"; | |
std::cout << oss.str() << std::flush; | |
} | |
}; | |
class B : public A { | |
public: | |
B() { | |
std::ostringstream oss; | |
oss << "Constructor B@" << std::hex << (void *)this << "\n"; | |
std::cout << oss.str() << std::flush; | |
} | |
~B() { | |
std::ostringstream oss; | |
oss << "Destructor B@" << std::hex << (void *)this << "\n"; | |
std::cout << oss.str() << std::flush; | |
} | |
}; | |
class VA { | |
public: | |
VA() { | |
std::ostringstream oss; | |
oss << "Constructor VA@" << std::hex << (void *)this << "\n"; | |
std::cout << oss.str() << std::flush; | |
} | |
virtual ~VA() { | |
std::ostringstream oss; | |
oss << "Destructor VA@" << std::hex << (void *)this << "\n"; | |
std::cout << oss.str() << std::flush; | |
} | |
}; | |
class VB : public VA { | |
public: | |
VB() { | |
std::ostringstream oss; | |
oss << "Constructor VB@" << std::hex << (void *)this << "\n"; | |
std::cout << oss.str() << std::flush; | |
} | |
virtual ~VB() { | |
std::ostringstream oss; | |
oss << "Destructor VB@" << std::hex << (void *)this << "\n"; | |
std::cout << oss.str() << std::flush; | |
} | |
}; | |
int main(int argc, char const *argv[]) { | |
std::cout << "======================= Stack Test =======================" << std::endl; | |
{ | |
A a; | |
B b; | |
} | |
{ | |
VA va; | |
VB vb; | |
} | |
std::cout << "======================= Heap Test =======================" << std::endl; | |
{ | |
A *b = new B(); | |
delete b; // IMPORTANT: Resource Leak Here! | |
} | |
{ | |
VA *vb = new VB(); | |
delete vb; | |
} | |
std::cout << "======================= SmartPtr Test =======================" << std::endl; | |
{ | |
std::shared_ptr<A> pB = std::make_shared<B>(); | |
} | |
{ | |
std::shared_ptr<VA> pVB = std::make_shared<VB>(); | |
} | |
std::cout << "======================= End Test =======================" << std::endl; | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment