c++堆和栈(2)
2015-11-14 17:11
190 查看
上个介绍了堆和栈的不同,接下来介绍一下禁止堆和栈上创建的方法。
栈对象,自动释放时,会调用它的析构函数。如果我们在栈对象中封装资源,而且在栈对象的析构函数中释放资源,内存泄漏的概率大大减少,因为栈对象可以自动释放资源,即使在所在函数发生异常的时候。(接下来是在c++内存管理摘了一段,并不怎么懂)过程是这样的:函数抛出异常的时候,会发生所谓的堆栈回滚(stack_unwinding),即堆栈展开,由于是栈对象,在堆栈回滚的过程中,析构函数会被执行,从而释放锁封装的资源。除非在析构函数中再次发生异常,但是可能性很少,所以用栈对象是比较安全的,所以我们就希望只在栈中创建对象,而限制在堆中创建。
方法: new的时候会调用operator new,令operator new重载 为private就可以了(最好也把operator delete也重载成private的)。
同样,我们想禁止产生栈对象,怎么办呢:
如果一个类不打算成为基类,通常将析构函数声明为private,为了限制栈对象,却不限制继承,我们可以将析构函数声明为protected。
栈对象,自动释放时,会调用它的析构函数。如果我们在栈对象中封装资源,而且在栈对象的析构函数中释放资源,内存泄漏的概率大大减少,因为栈对象可以自动释放资源,即使在所在函数发生异常的时候。(接下来是在c++内存管理摘了一段,并不怎么懂)过程是这样的:函数抛出异常的时候,会发生所谓的堆栈回滚(stack_unwinding),即堆栈展开,由于是栈对象,在堆栈回滚的过程中,析构函数会被执行,从而释放锁封装的资源。除非在析构函数中再次发生异常,但是可能性很少,所以用栈对象是比较安全的,所以我们就希望只在栈中创建对象,而限制在堆中创建。
方法: new的时候会调用operator new,令operator new重载 为private就可以了(最好也把operator delete也重载成private的)。
同样,我们想禁止产生栈对象,怎么办呢:
如果一个类不打算成为基类,通常将析构函数声明为private,为了限制栈对象,却不限制继承,我们可以将析构函数声明为protected。
相关文章推荐
- struct和typedef struct彻底明白了
- 用C语言编写函数,实现strlen计算字符串长度的功能
- C语言的那些秘密之---函数返回局部变量
- c++primer文本查询系统
- 我准备的C++面试题
- c语言:常用各种头文件的作用,如:#include <stdlib.h>
- C++基本知识(二)——vector与迭代器和数组与指针
- C++STL之迭代器
- 从零开始学C++之STL(一):STL六大组件简介
- C++标准模板库 迭代器 iterator 详解(二)
- C++标准模板库 迭代器 iterator 详解(一)
- 浅析OC语言
- VC++中从txt文本中读取数据并且存到二维数组中
- C++迭代器 iterator (二)
- C++迭代器 iterator (一)
- C语言基础-结构体
- C++迭代器
- 【C语言】【笔试题】模拟实现strstr函数
- 【LeetCode-299】Bulls and Cows
- C++迭代器的使用方法