资源必须先分配后释放(见5.2节)。我们用new分配内存,用delete释放内存(见11.2节);用fopen()打开文件,用fclose()关闭文件(见43.2节),因此内存和文件都是资源。指针是最常用的资源句柄。这一点不太容易理解,毕竟在程序中指针随处可见,而且作为资源句柄的指针和不作为资源句柄的指针似乎没什么差别。例如:
void confused(int* p) { //释放掉p? } int global{7}; void f() { X* pn = new int{7}; int i{7}; int q = &i; confused(pn); confused(q); confused(&global); }
如果在confused()中delete掉p,则当执行后面两个调用时程序将发生非常严重的错误,原因是对于不是由new分配的对象,我们无权delete它(见11.2节)。然而,如果confused()没有delete掉p,又会造成程序的资源泄露(见11.2.1节)。在此例中,很明显应该由f()负责管理它创建在自由存储上的对象的生命周期。但是通常情况下,在一个规模较大的程序中我们需要使用某种简单有效的策略追踪和维护那些需要delete的资源。
一种比较好的策略是把表示某种所有权的指针全都置于vector、string和unique_ptr等资源句柄类中。此时,我们就能假定所有不在资源句柄中的指针都不负责管理资源,因此也不必对它们执行delete操作。第13章将详细讨论资源管理的细节。