在知乎上看到一个问题,问一下代码为什么错:
//...
vector<int> x;
//....
x.swap(vector<int>(x)); //错误出现的地方
我的错误解答是:
因为 vector<int>(x) 产生了一个临时对象,将该临时对象与 X 进行 swap 操作,交换了对方的三个指针(first,end,finish),指向分配的内存空间,然后再该语句结束后,临时对象被释放掉,所以此时 x 所指向的内存(原来临时对象的内存空间)被释放了, 而 x 原本的内存则发生了泄露
解释的漏洞:
两个 vector 对象交换指针后,临时对象所指向的内存就更新为原本x 的内存了,临时对象被销毁时将调用临时对象的析构函数,该析构函数释放的是临时对象现在所指内存空间。因此,原本的X所指的内存空间将被释放,而现在X所指的内存空间将仍然保留。因此错误不出现在这个地方
正确的解答:
临时对象不能绑定到非const引用上!!!!!!!!!
因为 swap 的函数原型为:
<span style="font-size:14px;">void swap(vector<T, Alloc>& x</span>)
可以看到,如果按上述的写法,则希望将临时对象绑定到一个非const引用上,将会在绑定的过程中报错。但是VS2013运行上述语句时已经不报错了,而G++仍然报错