主要后防止自我毁灭?

时间:2015-03-21 07:53:22

标签: c++ c++11 asynchronous memory-leaks stl

我在C ++中编写了一些异步I / O内容,我需要阻止一个对象被破坏,直到调用异步I / O的处理程序。我试图使用shared_ptr并使用静态构造函数创建我的对象,因此我可以确定它正在使用引用计数。然后我将其保存在weak_ptr中,直到我启动异步I / O,然后将其存储到另一个shared_ptr中,以确保它在此期间不会失效。最后,我在回调完成时重置它。这是一个例子:

#pragma once

#include <memory>
#include <functional>

using namespace std;

class SomeIO {
    std::weak_ptr<SomeIO> self;
    std::shared_ptr<SomeIO> savingSelf;

    void myCallback() {
        // do my callback stuff here
        savingSelf.reset();
    }
public:
    SomeIO() = delete;
    ~SomeIO() {}

    static shared_ptr<SomeIO> create() {
        auto self = make_shared<SomeIO>();
        self->self = self;
        return self;
    }

    void start() {
        savingSelf = self.lock();
        //startSomeAsyncIO(bind(self, SomeIO::myCallback));
    }
};

int main() {
    auto myIO = SomeIO::create();

    myIO->start();

    return 0;
}

我的问题是,主要回归后会发生什么?它会在最终引用发布之前保持活动状态,还是会导致内存泄漏?如果这确实导致内存泄漏,我该如何处理这种情况,以便可以取消异步I / O并且程序可以在没有内存泄漏的情况下结束?我认为shared_ptr可以保护我免受内存泄漏的影响,但我对这种情况不太确定。

谢谢!

1 个答案:

答案 0 :(得分:0)

在C ++中(与Java相反),程序在主要结束时结束。所有其他线程都被终止。内存泄漏不是你的问题,因为无论如何程序结束并且所有内存都被释放。

你可以使用std :: thread和std :: thread :: join来阻止程序过早退出:

int main (void){

std::thread myAsyncIOThread ([]{
    auto myIO = SomeIO::create();
    myIO->start();
});

//other things you program needs to do
myAsyncIOThread.join();
return 0;
} 

您可能希望对程序中的Thread-Pool感兴趣。