Aug 21

解决交换技巧引起的对匿名变量生存周期de疑问.. 不指定

felix021 @ 2008-8-21 13:03 [IT » 程序设计] 评论(0) , 引用(0) , 阅读(3581) | Via 本站原创 | |
    在C++里,STL中string和vector的空间是可以自动增长的,但是有一个问题是,当你将它们中的元素删除(甚至是使用clear函数)时,多余的空间不会被释放,这时候可以用一个交换技巧(详见Effective STL)来清空多余的元素:
    释放vt中的多余元素占用空间:vector<int>(vt).swap(vt);
    释放vt中的所有元素占用空间:vector<int>().swap(vt);
    这样一句话中其实执行了好几个步骤。在第一种方法里,vector<int>(vt)创建了一个匿名变量并用vt中的值对其初始化,然后调用它的swap()方法,和vt交换,这时vt中的大小就正好只有那么大;第二种方法里,vector<int>创建了一个空的匿名变量并和vt交换,于是vt就被清空了。同样的,对于string也可以string ().swap(str)或string (str).swap(str)。
    但是这带来另一个问题:那个匿名变量占用的空间怎么释放?看一个例程:

#include<iostream>
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.



欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
Tags:
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]