gpt4 book ai didi

c++ - 防止在 main 之后 self 破坏?

转载 作者:太空宇宙 更新时间:2023-11-04 13:37:08 24 4
gpt4 key购买 nike

我正在用 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 可以保护我免受内存泄漏,但我不太确定这种情况。

谢谢!

最佳答案

在 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;
}

您可能会对在您的程序中使用线程池感兴趣。

关于c++ - 防止在 main 之后 self 破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29180487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com