因此,如果我理解正确,RAII的重点是消除内存管理的麻烦。也就是说,您在对象的析构函数中进行删除。这样,当指针超出范围时,您不必担心删除它。所以这就是我不明白的原因:为什么不首先在堆栈上声明变量?
答案 0 :(得分:2)
您无法在堆栈上声明数据库连接或窗口或文件。至少,有争议的是,这正是RAII允许你做的事情,但如果不这样做,你就做不到。
答案 1 :(得分:2)
您的理解存在一些问题:
RAII的目的是消除资源管理的麻烦,而不仅仅是记忆。例如:需要关闭的文件句柄,需要解锁的互斥锁,需要释放的对象,需要释放的内存。基本上,如果你在使用资源时有必要的话,这对RAII来说是个好例子。
当原始C ++指针超出范围时,它什么都不做。我假设你在谈论一个智能指针,它只是一个包裹原始指针的对象。当该对象超出范围时,将调用其析构函数,并且可以依次使用析构函数释放在构造函数中分配的内存。
在堆栈或堆上是否分配了需要“释放”的对象没有区别。关键是你在获取资源时在构造函数中做了一些事情,并在完成它时在析构函数中做了其他事情。
答案 2 :(得分:1)
RAII的要点是无论你如何退出范围,都会调用析构函数。
因此,无论您是正常退出还是抛出异常,您的资源都会被释放。
BTW,“资源”不一定只是内存 - 它可以是文件句柄,数据库连接等。