C++ 以对象管理资源

简介: C++中使用到的资源可能很多,并且一些资源获取后还必须释放归还给系统, 列举几个如:1. 打开的文件句柄2. 数据库连接3. 互斥锁4. 动态分配new出来的内存5. 网络socket连接 C++中有智能指针,比如shared_ptr,可以自动释放指针指向的资源。

C++中使用到的资源可能很多,并且一些资源获取后还必须释放归还给系统, 列举几个如:

1. 打开的文件句柄

2. 数据库连接

3. 互斥锁

4. 动态分配new出来的内存

5. 网络socket连接


 C++中有智能指针,比如shared_ptr,可以自动释放指针指向的资源。

这里不详细说shared_ptr用法。

而是自己实现一个以对象管理资源的例子


例子:线程互斥锁的加锁、解锁。

1. 利用对象到构造函数,析构函数来自动完成加锁、解锁。将编译器默认提供的无用函数禁用掉。

 1 class MutexLock{
 2 public:
 3     explicit MutexLock(pthread_mutex_t *_lock):lock_obj(_lock){
 4         pthread_mutex_lock(lock_obj);
 5     }   
 6 
 7     ~MutexLock(){
 8         pthread_mutex_unlock(lock_obj);
 9     }   
10     
11 private:
12     pthread_mutex_t * const lock_obj;
13     //No copying allowed
14     MutexLock(const MutexLock&);
15     void operator=(const MutexLock&);   
16 };

2. 线程执行函数

 1 void *add(void* args){
 2     sleep(1);
 3     for(int i = 0; i < TASK_CNT; ++i){
 4         /*  
 5         //显示加锁, 解锁
 6         pthread_mutex_lock(&lock);
 7         g_num++;
 8         //如果return, break, 则不能释放锁
 9         pthread_mutex_unlock(&lock);
10         */
11 
12         //使用构造函数加锁, 析构函数解锁
13         MutexLock mu_lock(&lock);
14         g_num++;
15     }   
16     pthread_exit(NULL);
17 }

3. 整体代码

 1 #include <pthread.h>
 2 #include <iostream>
 3 
 4 int g_num = 0;
 5 const int THREAD_CNT = 4;
 6 const int TASK_CNT   = 10000000;
 7 pthread_mutex_t lock;
 8 
 9 class MutexLock{
10 public:
11     explicit MutexLock(pthread_mutex_t *_lock):lock_obj(_lock){
12         pthread_mutex_lock(lock_obj);
13     }   
14 
15     ~MutexLock(){
16         pthread_mutex_unlock(lock_obj);
17     }   
18     
19 private:
20     pthread_mutex_t * const lock_obj;
21     //No copying allowed
22     MutexLock(const MutexLock&);
23     void operator=(const MutexLock&);   
24 };
25 
26 void *add(void* args){
27     sleep(1);
28     for(int i = 0; i < TASK_CNT; ++i){
29         /*  
30         //显示加锁, 解锁
31         pthread_mutex_lock(&lock);
32         g_num++;
33         //如果return, break, 则不能释放锁
34         pthread_mutex_unlock(&lock);
35         */
36 
37         //使用构造函数加锁, 析构函数解锁
38         MutexLock mu_lock(&lock);
39         g_num++;
40     }   
41     pthread_exit(NULL);
42 }
43 
44 int main(){
45     pthread_t pid[THREAD_CNT];
46 
47     pthread_mutex_init(&lock, NULL);
48     for(int i = 0; i < THREAD_CNT; ++i){
49         pthread_create(&pid[i], NULL, add, NULL);
50     }
51 
52     for(int i = 0; i < THREAD_CNT; ++i){
53         pthread_join(pid[i],NULL);
54     }
55 
56     std::cout << "g_num = " << g_num << std::endl;
57     return 0;
58 }
View Code

 

c++智能指针可以参考网上的例子:

http://www.cnblogs.com/lanxuezaipiao/p/4132096.html

相关文章
|
8月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
8月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
12月前
|
编译器 C++
C++之类与对象(完结撒花篇)(上)
C++之类与对象(完结撒花篇)(上)
90 0
|
7月前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
7月前
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。
|
7月前
|
编译器 C++
类和对象(下)C++
本内容主要讲解C++中的初始化列表、类型转换、静态成员、友元、内部类、匿名对象及对象拷贝时的编译器优化。初始化列表用于成员变量定义初始化,尤其对引用、const及无默认构造函数的类类型变量至关重要。类型转换中,`explicit`可禁用隐式转换。静态成员属类而非对象,受访问限定符约束。内部类是独立类,可增强封装性。匿名对象生命周期短,常用于临时场景。编译器会优化对象拷贝以提高效率。最后,鼓励大家通过重复练习提升技能!
|
9月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
171 19
|
9月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
209 13
|
8月前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
8月前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。