C++编程思想(2nd卷一):动态对象创建

来源:互联网 发布:淘宝线下安装店加盟 编辑:程序博客网 时间:2024/06/05 06:32

当创建一个C++对象时,会发生两件事:
1.为对象分配内存。
2.调用构造函数来初始化那个内存。

为对象分配内存:
1)在静态存储区域,存储空间在程序开始之前就可以分配。这个存储空间在程序整个运行期间都存在。
2)无论何时到达一个特殊的执行点(左大括号)时,存储单元都可以在栈上被创建。出了执行点(右大括号),这个存储单元自动被释放。这些栈分配运算内置于处理器的指令集中,
3)存储单元也可以从一块称为堆的地方分配,这被称为动态内存分配。

人们经常建议在删除指针后立即把指针赋值为0以免对它删除两次。

如果delete一个void指针,唯一发生的事就是释放了内存,这是因为既没有类型信息也没有办法使得编译器知道要调用哪个析构函数。

如果想对一个void*类型指针进行delete操作,要注意这将可能成为一个程序错误,除非指针所指的内容是非常简单的,因为,它将不执行析构函数。
Object* a = new Object(40, 'a');
delete a;
void* b = new Object(40, 'b');
delete b;
输出为:
Constructing object a, size = 40
Destructing object a
Constructing object b, size = 40
因为delete a知道a指向一个Object对象,所以析构函数将会被调用,从而释放了分配给data的内存。但是,正如在进行delete b的操作中,如果通过void*类型的指针对一个对象进行操作,则只会释放Object对象的内存,而不会调用析构函数,也就不会释放data所指向的内存。编译这个程序时,编译器会认为我们知道所做的一切。于是我们不会看到任何警告信息。但因此我们会丢失大量的可用内存。

如果在程序中发现内存丢失的情况,那么就搜索所有的delete语句并检查被删除指针的类型。如果是void*类型,则可能发生了引起内存丢失的某个因素(因为C++还有很多其他的引起内存丢失的因素)。

原创粉丝点击