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

相关文章
|
13天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
16天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
5月前
|
编译器 C++
C++之类与对象(完结撒花篇)(上)
C++之类与对象(完结撒花篇)(上)
55 0
|
13天前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
13天前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
2月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
73 19
|
2月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
60 13
|
4月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
163 5
|
4月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
189 4
|
4月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
280 4