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

转载 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、闭包)

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

eclipse和myeclipse中如何关闭自动补全括号,花括号,双引号等功能

eclipse和myeclipse中如何关闭自动补全括号,花括号,双引号等功能   (2013-05-22 23:51:45) 转载▼ 标签:  eclipse ...

Eclipse的花括号(brace)的输入偏好问题

http://www.cnblogs.com/likwo/archive/2010/04/23/1718777.html 最近在看系列风中叶(张龙)老师的一些关于Java方面的视频,发现风老师每...

C++代码风格:关于左花括号位置的研究

C++代码风格:关于左花括号位置的研究 C/C++中左花括号位置的争论由来已久,本文分析了两种写法产生的历史缘由,并提出现在我们应该采用的写法和理由。 下面是引起争论的两种风格: ...

react, Stateless Functions, ES6 花括号参数, Spread operator

请看一个例子:const FilterLink = (props) => { return ( { e.preventDefault(); store.dispatch({ ...

C语言 编写一个程序,它从标准输入读取C源代码,并验证所有的花括号都正确的成对出现。

编写一个程序,它从标准输入读取C源代码,并验证所有的花括号都正确的成对出现。 注意ch = getchar()) != EOF的使用,同时定义一个计数器count,便于判断括号是否匹配。#inclu...

iOS中switch case语句里面不能定义对象,有语法错误,除非加一个花括号

switch case语句里面不能定义对象,有语法错误,除非加一个花括号  2015-07-03 16:49 114人阅读 评论(0) 收藏 举报  分类: iOS(24...

实现编写一个程序,它从标准输入读取C源代码,并验证所有的花括号都正确的成对出现。

//从标准输入读取C源代码,并验证所有的花括号都正确的成对出现
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:花括号({...})在自动资源释放中的作用
举报原因:
原因补充:

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