删除它,然后返回创建的对象

Delete this and then returning created object

本文关键字:创建 对象 返回 然后 删除      更新时间:2023-10-16

我正在创建一些模板类,现在要将它们相互转换。我写了一个函数,现在想知道它有多糟糕:

template<class ConnectionType>
class CONNECTION
{
public:
    ConnectionType weight;
    template<class FinalType> CONNECTION<FinalType>* ConvertTo()
    {
        CONNECTION<FinalType>* temp = new CONNECTION<FinalType>( );
        temp->weight = (FinalType)this->weight;
        delete this;
        return temp;
    }
    virtual ~CONNECTION() {}
};

如你所见,我创建新对象,复制数据,删除当前对象并返回新对象。那么现在是否可以先调用delete this然后在对象被释放后返回由destroy 1的方法创建的返回对象?

有几件事使'delete this'成为一个坏主意,但其中之一是迟早有人会做这样的事情:

Connection<Foo> foo;
Connection<Bar> * bar = foo.ConnectTo<Bar>();  // oops!

…此时ConnectTo()将尝试删除foo,并且由于foo没有分配新的,未定义的行为和崩溃和一般的不愉快将随之而来。

这是个坏主意。您最好学习使用引用计数指针(boost中的shared_ptr或后来的标准调用它们-我现在正在空白)。一旦你这样做了,你的编码风格就会改变,生活就会变得干净、简单和可靠。你再也不写新代码或删除代码了,小猫呜呜叫,羊羔嬉闹,…

不开玩笑了,这确实是一个非常值得学习的成语

在你的例子中,当"旧"连接对象不再被引用时,它将被删除。