C++里临时对象在创建语句执行完毕之后就立即被销毁。
一 代码验证
假设有如下代码,
#include <iostream>
class A
{
public:
~A()
{
std::cout << "XXX\n";
};
};
int main(void)
{
A();
std::cout << "YYY\n";
return 0;
}
类A的析构函数加了打印,main函数里先创建类A的临时对象,然后打印别的语句,最后编译运行,结果如下,  可以看出,当临时对象的创建语句执行完毕后就会被销毁。
二 避坑
假如我们有如下代码,
#include <iostream>
#include <vector>
class A
{
public:
std::vector<int> getVector(void)
{
return m_vData;
}
void addData(int data)
{
m_vData.push_back(data);
}
private:
std::vector<int> m_vData;
};
int main(void)
{
A a;
a.addData(100);
a.addData(200);
a.addData(300);
auto it = a.getVector().cbegin();
for (; it != a.getVector().cend(); ++it)
{
std::cout << *it << "\n";
}
return 0;
}
类A的getVector()方法会返回m_vData的一份拷贝,在main函数里,我们使用a.getVector().cbegin()来获取迭代器,然后遍历,最后打印如下,  很明显与预期不符,问题就出在这条语句,
auto it = a.getVector().cbegin()
a.getVector()会产生一个vector临时对象,然后获取这个临时对象的迭代器来赋值给it,这样当这条语句执行完毕后,临时对象已经被销毁,这样it指向的内存空间已经失效,就会造成打印异常。
解决办法有2种:
-
使用一个具名的vector变量来承接a.getVector()的返回值, int main(void)
{
A a;
a.addData(100);
a.addData(200);
a.addData(300);
std::vector<int> ret = a.getVector();
auto it = ret.cbegin();
for (; it != ret.cend(); ++it)
{
std::cout << *it << "\n";
}
return 0;
}
-
让getVector()返回m_vData的引用(指针也可以),这样前面main函数里的调用方式就可以正常运行了 class A
{
public:
const std::vector<int>& getVector(void)
{
return m_vData;
}
void addData(int data)
{
m_vData.push_back(data);
}
private:
std::vector<int> m_vData;
};
最后打印如下, 
|