delete this + memmove(this,new A(),sizeof(A)) 安全吗?这是个坏主意吗?
is delete this + memmove(this,new A(),sizeof(A)) safe and is it a bad idea?
我搜索了一些post关于在c++中删除这个,并且知道删除这个通常是一个坏主意,因为删除这个通常意味着管理不善:新的和删除的数量不匹配,也是class 之外的一些指针可能仍然指向此。
但是post我搜索的主要是删除原对象,没有讨论用新对象替换原对象的情况。
有时我想重新创建对象,因为我想让对象回到初始状态,通过 "realloc" 对象使用 delete this+memmove(this,new A(),sizeof(A) ) 像这样:
class A{
public:
int value;
void test(){
delete this;
memmove(this,new A(),sizeof(A));
}
};
安全吗?还是有任何未定义的行为?
即使它能工作,它是一种糟糕的编码风格吗?
删除此释放内存。所以 memmove 写入一个悬空指针,这是未定义的行为。
我不知道你想做什么,但你试过 c++11 中引入的 move 构造函数吗?
您可以调用 delete this
- 某些引用计数实现中使用的自毁机制以这种方式工作但是您可能永远不会引用 this
再次因为结果未定义。
如果您想将同一个对象恢复到初始状态,那么您不能提供完成这项工作的私有 cleanup()
和 init()
方法吗?
此代码大量存在于 UndefinedBehaviour 领域。 delete this
不仅仅调用析构函数——它还释放内存。 memmove
因此复制到未分配的内存中。
此外,它有内存泄漏,因为从 new A()
返回的指针会立即被遗忘。
我相信你打算这样做:
void test()
{
this->~A();
new (this) A();
}
这会调用 this
上的析构函数,然后调用 this
指向的 space 中的默认构造函数。
真正的问题是为什么要这样做。这是相当复杂的底层管理。在我看来,最好给 class 一个合适的赋值运算符,然后这样做:
void test()
{
*this = A();
}
记住,越容易理解代码的作用,一般来说代码就越好。
我搜索了一些post关于在c++中删除这个,并且知道删除这个通常是一个坏主意,因为删除这个通常意味着管理不善:新的和删除的数量不匹配,也是class 之外的一些指针可能仍然指向此。
但是post我搜索的主要是删除原对象,没有讨论用新对象替换原对象的情况。
有时我想重新创建对象,因为我想让对象回到初始状态,通过 "realloc" 对象使用 delete this+memmove(this,new A(),sizeof(A) ) 像这样:
class A{
public:
int value;
void test(){
delete this;
memmove(this,new A(),sizeof(A));
}
};
安全吗?还是有任何未定义的行为?
即使它能工作,它是一种糟糕的编码风格吗?
删除此释放内存。所以 memmove 写入一个悬空指针,这是未定义的行为。
我不知道你想做什么,但你试过 c++11 中引入的 move 构造函数吗?
您可以调用 delete this
- 某些引用计数实现中使用的自毁机制以这种方式工作但是您可能永远不会引用 this
再次因为结果未定义。
如果您想将同一个对象恢复到初始状态,那么您不能提供完成这项工作的私有 cleanup()
和 init()
方法吗?
此代码大量存在于 UndefinedBehaviour 领域。 delete this
不仅仅调用析构函数——它还释放内存。 memmove
因此复制到未分配的内存中。
此外,它有内存泄漏,因为从 new A()
返回的指针会立即被遗忘。
我相信你打算这样做:
void test()
{
this->~A();
new (this) A();
}
这会调用 this
上的析构函数,然后调用 this
指向的 space 中的默认构造函数。
真正的问题是为什么要这样做。这是相当复杂的底层管理。在我看来,最好给 class 一个合适的赋值运算符,然后这样做:
void test()
{
*this = A();
}
记住,越容易理解代码的作用,一般来说代码就越好。