是删除这个+ memmove(这个,新的A(),sizeof(A))安全,这是一个坏主意?

我搜索了一些关于在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));
    }
};

这样安全吗? 或者有任何未定义的行为?

即使它工作,它是一个糟糕的编码风格?

采纳答案:

此代码主要位于UndefinedBehaviour-land中。 delete this它不仅仅是调用析构函数 - 它还会释放内存。 因此, memmove复制到未分配的内存中。

此外,它有内存泄漏,因为new A()返回的指针立即被遗忘。

我相信你打算这样做:

void test()
{
  this->~A();
  new (this) A();
}

这将调用析构函数,然后在此指向的空间中调用默认构造函数。

真正的问题是为什么这样做。 这是一个相当错综复杂的低层管理。 在我看来,最好给这个类赋一个合适的赋值操作符并执行以下操作:

void test()
{
  *this = A();
}

请记住,理解代码的功能越容易,代码通常就越好。

author: angew

参考更多解答: is delete this + memmove(this,new A(),sizeof(A)) safe and is it a bad idea? ,转载请保留出处是删除这个+ memmove(这个,新的A(),sizeof(A))安全,这是一个坏主意?及作者信息

Statement: We respect knowledge and authors. Since the content comes from the Internet and is intended for scientific research, any reprinters should retain the author's signature and origin. If you are the author of the content and feel in dispute, please contact email: 1076545519@qq.com. We will find out the situation and deal with it in time. We sincerely thank the author for his hard work.


更多:coding-style