[问题] operator=里呼叫destructor

楼主: Caesar08 (Caesar)   2014-11-22 22:29:08
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++
问题(Question):
我之前都会在右值的operator=里面呼叫自己的destructor
直到我写了类似底下的code(真正的code里面是unordered_map),发现如果将
this->~A();替换成
for_each(vec.begin(),vec.end(),[](int* &val){delete val;});
在VC++上执行就不会有问题(不过在Ideone上面,两个版本都是正确执行的)
之所以会这么做,是因为假设会有很多个vector,那我每个都要做delete实在是太麻烦了
所以干脆呼叫自己的destructor,省去这些code(就是我懒的意思)
我不想用unique_ptr,因为这个A会有复制的行为,unique_ptr不符合我的要求,而且我
也不想用get()
再来,我找到以下这两个网址




照这样看起来,好像这是undefined behavior
而Effective C++ 2e里面的条款33说明,constructor或destructor里面通常会多放一些
code(虽然那篇是讲inline)
我在想是不是"这些code"导致我这样呼叫会错
但是我之前写都没有问题,所以我要问的就是
1.请问我这样写,到底是不是undefined behavior?
2.手动呼叫destructor,就算underfined behavior?
3.承上,如果是,那这样我就需要额外写一个clear(),做内存释放,对吧?
4.承2,如果不是,那为什么原本的code不行?
5.另外,如果我的data只有一个pointer,而不是container<pointer>这种的,那我这样
写,是对的吗?
(因为我之前好像没有写过放在container的,所以之前的code都没有出问题过,但因为
是undefined behavior,所以碰巧没问题?)
程式码(Code):(请善用置底文网页, 记得排版)
#include<algorithm>
#include<vector>
using namespace std;
class A
{
vector<int*> vec;
public:
A(){}
A& operator=(A &&rVal)
{
if(this!=&rVal)
{
this->~A();
vec=move(rVal.vec);
}
return *this;
}
~A()
{
for_each(vec.begin(),vec.end(),[](int* &val){delete val;});
}
};
int main()
{
A a;
a=A();
}
作者: dirkc (3781615)   2014-11-22 22:43:00
与问题无关,没看过reference to reference的用法(A &&rVal)另外reference to pointer应该不需要(int* &val)忘了说,好有趣的写法和思维
作者: littleshan (我要加入剑道社!)   2014-11-22 23:15:00
除非你用了placement new, 否则自己呼叫dtor几乎都是错误设计。以这个例子来说,你根本不需要去delete
作者: dirkc (3781615)   2014-11-22 23:16:00
阿是...原来如此回 && 那个
作者: littleshan (我要加入剑道社!)   2014-11-22 23:18:00
只需要写vec.swap(rVal.vec)就够了因为rVal马上就会被解构了,让它的解构式来处理就好
楼主: Caesar08 (Caesar)   2014-11-22 23:54:00
ls你讲的对...,我糊涂了。
作者: purpose (秀才遇到肥宅兵)   2014-11-22 23:55:00
就不需要自己写 copy ass. 因为 A 的资料成员内没有 ptr
作者: firose (guest也是也是也是也是也)   2014-11-22 23:59:00
copy assignment 就用 copy & swap idiom 就好了
作者: suhorng ( )   2014-11-23 01:29:00
借题问下, 呼叫 destructor 后, 是不是物件相当已经消灭,如果没用 placement new 重新生一个出来, 直接用 (move)assignment operator 是未定义行为呢?
楼主: Caesar08 (Caesar)   2014-11-23 12:58:00
如果照我想的话,是物件里面的东西已经消灭,但物件没有所以move assignment operator不会是undefined behavior

Links booklink

Contact Us: admin [ a t ] ucptt.com