您的位置:首页 > 编程语言 > C语言/C++

C++构造与析构类与类中的指针对象

2016-07-12 16:51 351 查看
类的构造与析构是一个较复杂的问题,尤其涉及到一个类中包含多个对象时,比较难以理解,先看代码:

#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;
}


这种innerid会引起中断,因为in1没有被初始化!

重新改代码,在构造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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: