我在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
可以保护我免受内存泄漏的影响,但我对这种情况不太确定。
谢谢!
答案 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感兴趣。