文章

代码

#include <vector>
#include <iostream>
#include "vld.h"

using namespace std;

class Base
{
public:
	Base(){}
	~Base()
	{
		cout << "Base Destructor" << endl;
	}
};

class Derive : public Base
{
public:
	Derive()
	{
		vecInt.push_back(0);
		vecInt.push_back(2);
	}
	~Derive()
	{
		cout << "Derive Destructor" << endl;
	}

	vector<int> vecInt;
};

int main(int argc, char ** argv)
{
	Base * a = new Derive();
	delete a;
	return 0;
}

vld内存检查:

Leak Hash: 0xFF7D4793, Count: 1, Total 8 bytes Call Stack (TID 7516): MSVCR100D.dll!operator new() e:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory (36): TestPrj.exe!std::_Allocatestd::_Container_proxy() + 0x15 bytes e:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory (187): TestPrj.exe!std::allocatorstd::_Container_proxy::allocate() + 0xB bytes e:\program files (x86)\microsoft visual studio 10.0\vc\include\vector (442): TestPrj.exe!std::_Vector_val<int,std::allocator >::_Vector_val<int,std::allocator >() + 0xA bytes e:\program files (x86)\microsoft visual studio 10.0\vc\include\vector (508): TestPrj.exe!std::vector<int,std::allocator >::vector<int,std::allocator >() f:\workspace\testprj\testprj\singletest\virtualdestructor.cpp (25): TestPrj.exe!Derive::Derive() + 0x59 bytes f:\workspace\testprj\testprj\singletest\virtualdestructor.cpp (40): TestPrj.exe!test_interface() + 0x2B bytes f:\workspace\testprj\testprj\main.cpp (6): TestPrj.exe!main() + 0xD bytes f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (555): TestPrj.exe!__tmainCRTStartup() + 0x19 bytes f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): TestPrj.exe!mainCRTStartup() kernel32.dll!BaseThreadInitThunk() + 0x12 bytes ntdll.dll!RtlInitializeExceptionChain() + 0x63 bytes ntdll.dll!RtlInitializeExceptionChain() + 0x36 bytes Data: D8 4C 48 00 00 00 00 00 .LH….. ……..

因为基类的析构函数没有加virtual,delete的时候只会释放基类声明的内存块,子类的成员变量占用的内存就忽略了,导致内存泄漏。