如何从方法中删除对象?

时间:2014-06-13 15:46:21

标签: c++ qt qt-signals

我有一个类的层次结构: struct Astruct B,存储在A的实例中。

我运行A的方法,它运行B的方法,下载与下载到B的插槽的连接信号异步的东西。

之后我不会使用A和B实例。它们保存在矢量中。

我需要的是从对象B获取有关下载完成的信息(来自B的方法运行方法A以通知它并将其数据保存到A)。通知后,不再需要B的实例(它存储了大量数据,所以我需要清除它)。但没有其他线程知道什么时候应该完成!

由于delete this的危险,调用插槽B的线程无法清除B对象。即使该线程设置了一些互斥锁(可以放置在A中),另一个等待所有时间到该互斥锁的线程也将删除它 - 这也很危险,因为插槽的线程仍然可以运行。

那么,如何在B通知的插槽中安全地删除B实例?

我尝试在这里创建代码示例(B - 下载程序,A - 存储):

struct Storage
{
    Downloader *d; // createrd in ctor
    Data data; // only value, not pointer (for some reasons). 
               //The same in 'Downloader'
    int downloadedFiles; // 0 by ctor

    void run() // think, main()
    {
        d->download(); // there is an array in my program. 
                           //Here is one Downloader*, because it is example
    }

    void finishedDownload()
    {
        ++downloadedFiles;
        data = a->data;
        // delete d; // wish, it would be done like that :( 
            // But the thread will be back to a->download()
    }
}

struct Downloader
{
    Data data;
    Internet internet;
    Storage *parent;

    void download()
    {
        internet.set('http://someurl.dat');
        connect( &internet, SIGNAL(downloaded()), this, SLOT(downloaded()) );
        internet.download(&data); // async
    }

public slots :
    void downloaded()
    {
        parent->finishedDownload();
        // And there is the finish of the thread, which was created by SIGNAL of Interget,
        //but I need to delete 'Data data' from this struct.. How?
    }
};

1 个答案:

答案 0 :(得分:1)

由于它标记为qt,请使用this->deleteLater()代替delete this