C++构造与析构类与类中的指针对象
2016-07-12 16:51
351 查看
类的构造与析构是一个较复杂的问题,尤其涉及到一个类中包含多个对象时,比较难以理解,先看代码:
这种innerid会引起中断,因为in1没有被初始化!
重新改代码,在构造outer时自动构造in1对象,然而这样又会引起内存泄漏的问题!
输出:
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;
}
#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;
}
相关文章推荐
- VC CArray
- 最优生成树(kruskal算法)
- HDU1518(dfs)java/ c++
- C++学习笔记:对文件流的写入和读取
- 基于C++11的线程池
- control may reach end of non-void function [-Werror,-Wreturn-type] 错误记录
- C++中Vector保存 原始指针和智能指针的析构问题
- C++类的静态成员初始化详细讲解
- VC 工程中包含 .c 或cpp文件编译时产生的.pch预编译头错误(C1853)
- 《C++ Primer Plus》第12章 类和动态内存分配 学习笔记
- C语言 二叉树的链式存储实例
- Leetcode 206. Reverse Linked List (Easy) (cpp)
- Effective Modern C++ 笔记(1):模板类型推导
- 控件响应鼠标操作事件中,判断IsIdle()作用
- 直接型FIR滤波器的C语言实现
- 借助编译器阅读耗子叔6个变态的C语言Hello World程序
- 设计模式之模板方法模式(C++)
- C语言学习笔记字符读入读出
- 趣味100道C语言程序题num three
- Counting Sort