繁体   English   中英

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

[英]is delete this + memmove(this,new A(),sizeof(A)) safe and is it a bad idea?

我搜索了一些有关在c ++中删除此内容的信息,并知道删除该内容通常不是一个好主意,因为删除该内容通常意味着管理不善:new和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();
}

这呼吁析构函数this ,然后在空间中的默认构造函数被指向this

真正的问题是为什么要这样做。 这是复杂的低层管理。 我认为,最好给该类一个合适的赋值运算符,然后执行以下操作:

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

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

删除此取消分配内存。 因此记忆记忆体会写入悬空指针,这是未定义的行为。

我不知道您要做什么,但是您是否尝试过移动c ++ 11中引入的构造函数?

您可以称之为delete this在某些引用计数实现中使用的自毁机制以这种方式工作, 由于结果不确定,您可能根本不会再引用this

如果您想将同一对象恢复到初始状态,那么您是否不能提供可以完成工作的私有cleanup()init()方法呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM