类的构造与析构是一个较复杂的问题,尤其涉及到一个类中包含多个对象时,比较难以理解,先看代码:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include<iostream>
using namespace std;
class inner{
public:
inner(){};
~inner(){
cout << "inner destructor calles" << endl;
};
int innerid;
};
class outer{
public:
outer(){};
~outer(){
cout << "outer destructor calles" << endl;
};
inner *in1;
int outterid;
};
int main()
{
outer *out = new outer();
out->in1->innerid = 1;
// char *p = new char[10];
//inner *inn = new inner();
delete out;
//delete inn;
//_CrtDumpMemoryLeaks();
return 0;
}
重新改代码,在构造outer时自动构造in1对象,然而这样又会引起内存泄漏的问题!
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include<iostream>
using namespace std;
class inner{
public:
inner(){};
~inner(){
cout << "inner destructor calles" << endl;
};
int innerid;
};
class outer{
public:
outer(){
in1 = new inner();
};
~outer(){
cout << "outer destructor calles" << endl;
};
inner *in1;
int outterid;
};
int main()
{
outer *out = new outer();
out->in1->innerid = 1;
// char *p = new char[10];
//inner *inn = new inner();
delete out;
//delete inn;
_CrtDumpMemoryLeaks();
return 0;
}
输出:
Detected memory leaks!Dumping objects ->
{152} normal block at 0x0040F8F8, 4 bytes long.
Data: < > 01 00 00 00
Object dump complete.
原因是in1未被析构!
在outer析构中增加delete操作!
未检测到内存泄漏,成功构造与析构!
成功执行的代码:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include<iostream>
using namespace std;
class inner{
public:
inner(){};
~inner(){
cout << "inner destructor calles" << endl;
};
int innerid;
};
class outer{
public:
outer(){
in1 = new inner();
};
~outer(){
delete in1;
cout << "outer destructor calles" << endl;
};
inline void innerset(int num){
in1->innerid = num;
};
inline int getin1()
{
return in1->innerid;
}
private:
inner *in1;
int outterid;
};
int main()
{
outer *out = new outer();
out->innerset(1);
cout << out->getin1() << endl;
// char *p = new char[10];
//inner *inn = new inner();
delete out;
//delete inn;
_CrtDumpMemoryLeaks();
return 0;
}