c++ primer -- 基于过程的设计(5)

1.在局部域中的变量声明引入了局部对象(local object)。有三种局部对象:自动对象(automatic object)、寄存器对象(register object)以及局部静态对象(local static object)。区分这些对象的是对象所在存储区的属性和生命期。

2.自动对象的存储分配发生在定义它的函数被调用时。分配给自动变量的存储区来自于程序的运行栈,它是函数活动记录的一部分。自动对象也被称为具有自动存储持续时间(automatic storage duration),或自动范围(automatic extent)。未初始化的自动对象包含一个随机的位模式,是该存储区上次被使用的结果。它的值是未指定的(unspecified)。在函数结束时,它的活动记录被从运行栈中弹出。与该自动对象相关联的存储区被真正释放。对象的生命期在函数结束时结束,它包含的任何值都被抛弃。

3.当一个自动变量的地址被存储在一个生命期长于它的指针时,该指针被称为空悬指针(dangling pointer)。

4.在函数中频繁被使用的自动变量可以用register声明。如果可能的话,编译器会把该对象装载到机器的寄存器中。如果不能够的话,则对象仍位于内存中。

5.关键字register对编译器来说只是一个建议。有些编译器可能忽略该建议,而是使用寄存器分配算法找出最合适的候选放到机器可用的寄存器中。因为编译器知道运行该程序的机器的结构,所以它选择的寄存器的内容时常常会做出更有意义的决定。

6.静态局部对象具有静态存储持续期间(static storage duration),或静态范围(static extent)。它的值在函数调用间保持有效,但其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。未经初始化的静态局部对象会被程序自动初始化为0.

7.第三种对象允许程序员完全控制它的分配与释放。这样的对象被称为动态分配的对象(dynamically allocated object)。动态分配的对象被分配在程序的空闲存储区(free store)的可用内存池中。程序员用new表达式创建动态分配的对象,用delete表达式结束此类对象的生命期。

8.new表达式是由关键字new及其后面的类型指示符构成的,该类型指示符可以是内置类型或class类型。new表达式没有返回实际分配的对象,而是返回指向该对象的指针。对该对象的全部操作都要通过这个指针间接完成。空闲存储区分如果new表达式调用new()操作符不能得到要求的内存,通常会抛出一个bad_alloc异常。

9.但指针pi所指对象的内存被释放时,它的生命期也随之结束。如果指针操作数被设置为0,则c++会保证delete表达式不会调用操作符delete()。delete表达式只能应用在指向的内存是用new表达式从空闲存储区分配的指针上。

10.与动态内存分配有关的程序错误:A)应用delete表达式失败,是内存无法返回空闲存储区。这杯称作为内存泄露(memory leak)。B)对同一内存区应用了两次delete表达式。C)在对象被释放后读写该对象。

11.auto_ptr对象是c++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象。#include <memory> 有下述三种定义形式:
auto_ptr<type_pointed_to> identifier(ptr_allocated_by_new);
auto_ptr<type_pointed_to> identifier(auto_ptr_of_same_type);
auto_ptr<type_pointed_to> identifier;//type_pointed_to代表由new表达式创建的对象类型
auto_ptr<int> pi(new int(1024));//pi被初始化为由new表达式创建的对象的地址,且该对象的初始化值为1024
//new表达式创建的对象由pi指向,当pi的生命期结束时,它将被自动释放
auto_ptr<string> pstr_auto(new string("abcdef"));
auto_ptr<string> pstr_auto2(pstr_auto);
当定义pstr_auto时,它知道自己对初始化字符串拥有所有权,并且有责任删除该字符串。当一个auto_ptr对象被用另一个auto_ptr对象初始化或赋值时,左边被赋值或初始化的对象就拥有了空闲存储区底层对象的所有权,而右边的auto对象则撤销所有责任。
auto_ptr<int> p_auto_int;
if(p_auto_int.get()!=0){}
p_auto_int.reset(new int(1024); //release()不仅像get()一样返回底层对象的地址,而且还会释放这对象的所有权。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值