相关疑难解决方法(0)

是否允许删除?

是否允许delete this;delete-statement是将在该类实例上执行的最后一个语句?当然,我确信this-pointer所代表的对象是newly-created.

我在考虑这样的事情:

void SomeModule::doStuff()
{
    // in the controller, "this" object of SomeModule is the "current module"
    // now, if I want to switch over to a new Module, eg:

    controller->setWorkingModule(new OtherModule());

    // since the new "OtherModule" object will take the lead, 
    // I want to get rid of this "SomeModule" object:

    delete this;
}
Run Code Online (Sandbox Code Playgroud)

我可以这样做吗?

c++ memory-management new-operator self-destruction delete-operator

225
推荐指数
8
解决办法
10万
查看次数

"删除这个"有什么用?

今天,我看到了一些遗留代码.在析构函数中有一个类似" delete this" 的语句.我想,这个调用将是递归的.它为什么有效?

我在Y!上做了一些快速搜索,我发现如果需要限制用户创建堆栈对象,我们可以将析构函数设为私有,并提供删除实例的接口.在提供的接口中,我们必须在此指针上调用delete.

是否还有其他使用此类陈述的情况?

c++ destructor memory-management self-destruction

28
推荐指数
2
解决办法
5400
查看次数

对象是否应该在C++中删除自己?

我在C#度过了最近4年,所以我对C++中当前的最佳实践和常见设计模式感兴趣.考虑以下部分示例:

class World
{
public:
    void Add(Object *object);
    void Remove(Object *object);
    void Update();
}

class Fire : Object
{
public:
    virtual void Update()
    {
        if(age > burnTime)
        {
            world.Remove(this);
            delete this;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们有一个负责管理一组对象并定期更新它们的世界.火是一种可能在许多不同情况下被添加到世界中的物体,但通常是世界上已有的另一物体.Fire是唯一知道什么时候它已经烧毁的对象,所以目前我已将它自行删除.造成火灾的对象可能不再存在或相关.

这是一件明智的事情还是有更好的设计来帮助清理这些物体?

c++ oop memory-management self-destruction resource-cleanup

24
推荐指数
6
解决办法
2万
查看次数

"删除这个"是个坏主意吗?

可能重复:
安全delete this吗?

我一直在为一个设计用作链表中的节点的类做一些工作,我想我会给类自己的删除功能而不是管理类这样做.所以基本上它是这样的:

void Class::Delete() {
    //Some cleanup code before deleting the object
    delete this;
}
Run Code Online (Sandbox Code Playgroud)

现在我已经对它进行了测试,看起来效果很好,但是我过去遇到过一个问题,即对象一直在运行代码,被删除,然后显然是通过尝试使用不再使程序崩溃存在的对象.

由于"删除这个"就在函数的末尾,它显然退出了函数并且工作正常,但这种做法是不是一个坏主意?如果我不小心,这会不会在我的脸上爆炸?

c++ memory-management

16
推荐指数
2
解决办法
1938
查看次数

在使用unique_ptr作为参数的类上调用方法是否合法?

例如,如果您有声明std::unique_ptr<A> a;,那么以下会导致问题吗?

a->foo(std::move(a));
Run Code Online (Sandbox Code Playgroud)

在我的例子中,foo是一个虚函数,所以我不能把它移出课堂.如果上面的代码结果导致问题,那么有什么方法可以产生相同的效果呢?

c++

5
推荐指数
1
解决办法
350
查看次数

从析构函数中调用delete会导致堆栈溢出吗?

下面的代码创建一个双指针B**B*.它将使用该指针为另一个指针分配内存,该指针将指向被调用B时创建的实例start():

class A:

class A
{
public:
    A()
    {
        fb = new B*;
        *fb = NULL;
    }

    ~A()
    {
        if(*fb)
            delete *fb;

        delete fb;
    }

    B** getfb()
    {
        return fb;
    }

private:
    B** fb;
};
Run Code Online (Sandbox Code Playgroud)

class B:

class B
{
public:
    B()
    {
        B** fb = a->getfb();

        *fb = this;
    }

    ~B()
    {
        B** fb = a->getfb();

        delete *fb;            // <--- stack overflow

        *fb = NULL;
    }

private:
    A* a; …
Run Code Online (Sandbox Code Playgroud)

c++ stack-overflow destructor memory-management

1
推荐指数
2
解决办法
1179
查看次数