花括号({...})在自动资源释放中的作用

转载 2012年03月28日 23:23:44

C/C++,我们司空见惯地甚至想当然地使用{},一般大家都认为只要 {  } 成对出现就可以了。诚然, } 必须成对出现,但有些时候,尤其是在使用RAII的时候,它代表了RAII对象的作用域。关于RAII的原理说明,请见:

http://patmusing.blog.163.com/blog/static/13583496020101824142699/

 

参考下面代码,并注意其中的注释:

// 自动释放资源中花括号的作用

// RAII = Resource Allocation In Initialization

#include <iostream>

#include <string>

using namespace std;

 

// 资源类

class Student

{

public:

         Student(const string name = "Andrew", string gender = "M"int age = 6)

         {

                  this->name = name;

                  this->gender = gender;

                  this->age = age;

         }

 

         void printStudentInfo()

         {

                   cout << "Name: " << name << " ";

                   cout << "Gender: " << gender << " ";

                   cout << "Age: " << age << endl;

         }

 

         ~Student()

         {

                  // 下面这条语句用来提示资源是否被释放了

                   cout << "The destructor of class Student is called" << endl;

         }

 

private:

         string name;

         string gender;

         int age;

};

 

// 资源管理类

template<typename T>

class Resource

{

public:

         Resource(T* p)

         {

                  // 将新分配的到的资源的地址赋给res现在res指向了新分配到的资源

                   res = p;

         }

 

         ~Resource()

         {

                  if(res)

                   {

                            // 如果res指向的地址中,资源还没有被释放,那么则释放之

                            delete res;

                            res = 0;

                            cout << "Resources are deallocated here." << endl;

                   }

         }

 

         T* operator->() const

         {

                  if(res)

                            return res;                  // 返回T类型的指针res

                  else

                   {

                            cout << "The underlying object is empty." << endl;

                            return 0;                      // 返回空指针

                   }

         }

 

private:

         T *res;

};

 

// 测试代码

int main()

{

         Student *stu = new Student("Andrew""M", 7);

         // 测试块语句

         // 下面是一个块语句,亦称符合语句,可以将它看成一个语句。

         {

                   Resource<Student> res(stu);   // res是一个local对象,其作用域在{}之间,

                   res->printStudentInfo();              // 程序运行超出了{},那么res将会被自动

                   cout << "HIHI:" << endl;              // 析构

         }

 

         cout << "HOHO" << endl;

 

         return 0;

}

 

输出结果:

Name: Andrew Gender: M Age: 7

HIHI:

The destructor of class Student is called

Resources are deallocated here.

HOHO

 

从上面输出的结果可知,res只在花括号内存在,一旦程序运行超出了花括号,res对应的析构函数将会被自动执行,同时由于在res内部有delete stu;这样的语句,因此stu所指的对象也会因此被自动析构。


相关文章推荐

php变量作用域(花括号、global、闭包)

变量的作用域是变量的一个作用范围,在这个范围内变量为可见的,即可以访问该变量的代码区域, 相反,如果不在这个范围内,变量是不可见的,无法被调用。 (全局变量可以将作用范围看作为整个程序)

如何更改Java默认的花括号对齐方式

(1)很多程序员在使用Java的花括号对齐方式的时候都感觉一种这不是那么的

3.读c语言深度剖析 -- 单引号与双引号、逻辑运算符、位运算符、花括号

单引号与双引号 我们知道双引号引起来的都是字符串常量,单引号引起来的都是字符常量。 比如:‘a’和“a”完全不一样,在内存里前者占1个byte,后者占2个byte。 1,‘1‘,“1”。 第一...

Scala之小括号和花括号(Parentheses & Crurly Braces)

尽管这是一个非常基础的问题,但是如果不仔细梳理一下,还是会导致在某些场景下误读代码,原因是Scala对这个两兄弟的使用实在是太灵活了,甚至有些“随便”了,让我们分情况逐讨论一下。在调用函数时人们会笼统...

提高项目31.2-将代码中的花括号换行输出

#include #include #include void translateformat(char *source,char *destination); void showprogra...

关于Eclipse花括号偏好设置问题

不知用过Eclipse的同学们有没有发现

scala雾中风景(2): 小括号与花括号

下面的问题,表面上看是小括号与花括号的问题。 // map方法这样写不能编译通过 scala> List(2).map( case 2 => "OK" ) // 换做花括号就可以了 scala> ...

【C语言】验证花括号成对出现

题目要求 编写一个程序,它从标准输入(终端)读取C源代码,并验证所有的花括号都正确的成对出现。 注意:你不必担心注释内部、字符串常量内部和字符常量形式的花括号。 算法分析 我们先判断左花括号的数量是否...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)