C++ RAII

Posted 张杨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ RAII相关的知识,希望对你有一定的参考价值。

    今天学习了C++中的RAII机制,主要是应对内存泄露的情况,通过将内存的动态申请放置在构造函数中,将动态内存的释放放置在析构函数中实现。

    (1)malloc出来的空间,没有进行释放,存在内存泄漏;
    (2)如果在malloc和free之间抛异常,那么同样存在内存泄漏问题。该问题称为异常安全问题。

    这样,就将内存管理的职责下放给了对象,可以利用函数调用栈完成动态内存的管理,示例代码如下:

#include <iostream>

using namespace std;

template<class T>
class Raii {
public:
	Raii(T * ptr_ = nullptr):ptr(ptr_) {
	}
	~Raii(){
		if (nullptr != ptr) {
			cout << "delete ptr" << endl;
			delete ptr;
		}
	}
	T & operator*() {
		return *ptr;
	}
	T * operator->() {
		return ptr;
	}
private:
	T * ptr;
};
#include "RAII.h"

int main()
{
    int * ptr = new int();
    Raii<int> raii(ptr);
    return 0;
}

  可以看到,离开作用域后,ptr被Raii类的析构函数释放动态内存。

 

参考资料:

https://blog.csdn.net/Willing_hope/article/details/108233756

 

以上是关于C++ RAII的主要内容,如果未能解决你的问题,请参考以下文章

C++基于RAII对锁进行封装

除了 C++ 之外,其他语言的程序员是不是使用、了解或理解 RAII?

C++ RAII

C++ RAII 类中的 OpenGL 对象不再有效

C++ RAII 类中的 OpenGL 对象不再有效

C++ RAII 类中的 OpenGL 对象不再有效