Я пишу некоторые асинхронные элементы ввода-вывода в C++, и мне нужно предотвратить разрушение объекта до тех пор, пока его обработчик для асинхронного ввода-вывода не будет вызван. Я пытаюсь использовать shared_ptr
и создать свой объект со статическим конструктором, поэтому я могу быть уверен, что он использует подсчет ссылок. Затем я сохраняю это в weak_ptr
, пока не запустим асинхронный ввод-вывод, когда я храню его в другом 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;
}
Мой вопрос: что произойдет после основных возвратов? Будет ли он оставаться в живых до тех пор, пока не будет выпущена окончательная ссылка, или это вызовет утечку памяти? Если это вызывает утечку памяти, как мне обрабатывать эту ситуацию, чтобы асинхронный ввод-вывод мог быть отменен, и программа может закончиться без утечки памяти? Я думаю, что shared_ptr
защищает меня от утечек памяти, но я не уверен в этой ситуации.
Спасибо!
Вы должны сформулировать это по-другому: что должно произойти, когда основная часть возвращается? Имеет ли смысл, чтобы асинхронная операция оставалась незавершенной? Кто позаботится о его очистке? – juanchopanza
Вы просто хотите запустить свою функцию 'myCallback()' асинхронно до ее завершения? – Galik
Хммм, ему придется подождать и отправить событие, например, с вызовом 'epoll' в Linux. Я думаю, что вы правы, хотя это означает, что это HAS должно быть связано с циклом событий в любом случае, и я могу предотвратить окончание программы в этом eventloop, пока он не отправит все ожидающие события события. Спасибо за понимание! – crispyzeal