我搜索了一些关于在c ++中删除这个的帖子,并且知道删除这通常是一个坏主意,因为删除这通常意味着管理不善:new和delete的数量不匹配,也可能有一些指针在上课仍指向此。
但我搜索的帖子主要是删除原始对象,不讨论用新对象替换原始对象的情况。
有时候我想重新创建对象,因为我希望对象回到初始状态,通过“realloc”对象使用delete this + memmove(this,new A(),sizeof(A)),如下所示:
class A{
public:
int value;
void test(){
delete this;
memmove(this,new A(),sizeof(A));
}
};
安全吗?或者有任何未定义的行为?
即使它有效,也是一种糟糕的编码风格?
答案 0 :(得分:4)
此代码主要位于UndefinedBehaviour-land中。 delete this
不仅仅是调用析构函数,它还会释放内存。 memmove
因此复制到未分配的内存中。
此外,它有内存泄漏,因为从new A()
返回的指针立即被遗忘。
我相信你打算这样做:
void test()
{
this->~A();
new (this) A();
}
这将调用this
上的析构函数,然后调用this
指向的空格中的默认构造函数。
真正的问题是为什么这样做。这是一个相当错综复杂的低层管理。在我看来,最好给一个合适的赋值操作符并且这样做:
void test()
{
*this = A();
}
请记住,理解代码的功能越容易,代码通常就越好。
答案 1 :(得分:0)
删除此解除分配内存。因此,memmove写入悬空指针,这是一种未定义的行为。
我不知道你要做什么,但你是否尝试过在c ++ 11中引入的移动构造函数?
答案 2 :(得分:0)
你可以调用delete this
- 某些引用计数实现中使用的自毁机制以这种方式工作但是你可能根本不会再次引用this
因为结果未定义。
如果要将同一对象恢复到初始状态,那么您是否无法提供执行此工作的私有cleanup()
和init()
方法?