[英]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.