- 左值与右值是具体的值,引用是引用具体的值
- C++的值语义
- 还带
GC
的语言中,变量大都是引用语义,内存管理是交由机器来管理的 - 而C++可以通过值引用非常方便变量的生命周期,也就是可以通过
RAII
来管理资源
RAII
:resource Acquisition Is Initialization,资源获取即初始化。它是一种编程技术,主要用于管理资源(如内存、文件句柄、网络连接等)的生命周期,确保资源在使用完毕后能够被正确释放,从而避免资源泄漏。
- 资源的获取与对象的初始化绑定:在对象的构造函数中获取资源(如分配内存、打开文件等)
- 资源的释放与对象的销毁绑定:在对象的析构函数中释放资源(如释放内存、关闭文件等)
- 通过这种方式,
RAII
确保了资源的生命周期与对象的生命周期一致,从而避免了手动管理资源的复杂性和潜在错误 - 给不需要显式调用资源释放代码
RAII
典型应用场景:
- 内存管理:使用智能指针(
std::unique_prt
或std::shared_ptr
) - 文件管理:使用文件流对象(
std::ifstream
或std::ofstream
) - 锁管理:使用锁对象(
std::lock_guard
或std::unique_lock
)
RAII
实现原理:依赖对象的构造函数和析构函数的自动调用机制
#include <iostream>
class ManagedArray {
public:
ManagedArray(size_t size) : size_(size), data_(new int[size]) {
std::cout << "Array allocated of size " << size_ << std::endl;
}
~ManagedArray() {
delete[] data_;
std::cout << "Array deallocated" << std::endl;
}
int& operator[](size_t index) {
return data_[index];
}
private:
size_t size_;
int* data_;
};
int main() {
{
ManagedArray arr(10);
arr[0] = 42;
}
return 0;
}
{
std::unique_ptr<int> ptr(new int(10));
}
{
std::ofstream file("example.txt");
file << "Hello, RAII!";
}
std::mutex mtx;
{
std::lock_guard<std::mutex> lock(mtx);
}
- 代码理解:
- 在C++中的的
STL
是使用容器对象来管理数据,也使用函数对象来管理C语言中的函数指针 - 总之是使用对象概念来管理资源
- 引用:引用是别名,也就是对具体资源引用的一个别名,引用必须在声明时就要初始化,目的就是引用对象来修改它