标题:解决交换技巧引起的对匿名变量生存周期de疑问.. 出处:Felix021 时间:Thu, 21 Aug 2008 13:03:52 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?1100 内容: 在C++里,STL中string和vector的空间是可以自动增长的,但是有一个问题是,当你将它们中的元素删除(甚至是使用clear函数)时,多余的空间不会被释放,这时候可以用一个交换技巧(详见Effective STL)来清空多余的元素: 释放vt中的多余元素占用空间:vector(vt).swap(vt); 释放vt中的所有元素占用空间:vector().swap(vt); 这样一句话中其实执行了好几个步骤。在第一种方法里,vector(vt)创建了一个匿名变量并用vt中的值对其初始化,然后调用它的swap()方法,和vt交换,这时vt中的大小就正好只有那么大;第二种方法里,vector创建了一个空的匿名变量并和vt交换,于是vt就被清空了。同样的,对于string也可以string ().swap(str)或string (str).swap(str)。 但是这带来另一个问题:那个匿名变量占用的空间怎么释放?看一个例程: #include using namespace std; class temp{ public: temp(){} ~temp(){ cout << "~temp" << endl; } }; void f(temp a){ cout << "f" << endl;}; int main(){ cout << "0" << endl; f(temp()); cout << "1" << endl; return 0; } 运行后的输出为 0 f ~temp 1 也就是说,在一般情况下匿名变量的生存周期仅仅只是它所在的那一行而已。 但是可以通过常引用使得匿名变量继续存在,比如对上面的程序,定义一个常引用: const temp &a = temp(); 可以使得匿名变量存在到a的生存周期结束。 但是如果不是常引用,则是错误的,比如 temp &b = temp(); 编译器给出的错误提示是:不能将类型为‘temp&’的非 const 引用初始化为类型为‘temp’的临时变量 OVER. Generated by Bo-blog 2.1.0