Skip to content

Instantly share code, notes, and snippets.

@ncwhale
Last active March 6, 2019 10:58
Show Gist options
  • Save ncwhale/38b7ef6ac984c7a3ce5e52c26308de56 to your computer and use it in GitHub Desktop.
Save ncwhale/38b7ef6ac984c7a3ce5e52c26308de56 to your computer and use it in GitHub Desktop.
When to use virtual destructor.
#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