gpt4 book ai didi

c++ - delete this + memmove(this,new A(),sizeof(A)) 安全吗?这是个坏主意吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:21 24 4
gpt4 key购买 nike

我在c++中搜索了一些关于delete this的帖子,知道delete this通常是个坏主意,因为delete this通常意味着管理不善:new和delete的数量不匹配,也可能有一些指针在类仍然指向这个。

但是我搜索的帖子主要是关于删除原始对象的帖子,并没有讨论用新对象替换原始对象的情况。

有时我想重新创建对象,因为我希望对象回到初始状态,通过使用 delete this+memmove(this,new A(),sizeof(A)) 来“重新分配”对象,如下所示:

class A{
public:
int value;
void test(){
delete this;
memmove(this,new A(),sizeof(A));
}
};

安全吗?还是有任何未定义的行为?

即使它有效,它是否是一种糟糕的编码风格?

最佳答案

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

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

我相信你打算这样做:

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

这会调用this 上的析构函数,然后调用this 指向的空间中的默认构造函数。

但真正的问题是为什么要这样做。这是相当复杂的底层管理。在我看来,最好给类一个适当的赋值运算符并这样做:

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

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

关于c++ - delete this + memmove(this,new A(),sizeof(A)) 安全吗?这是个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31286820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com