2015-03-21 2 views
1

Я пишу некоторые асинхронные элементы ввода-вывода в 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 защищает меня от утечек памяти, но я не уверен в этой ситуации.

Спасибо!

+3

Вы должны сформулировать это по-другому: что должно произойти, когда основная часть возвращается? Имеет ли смысл, чтобы асинхронная операция оставалась незавершенной? Кто позаботится о его очистке? – juanchopanza

+0

Вы просто хотите запустить свою функцию 'myCallback()' асинхронно до ее завершения? – Galik

+0

Хммм, ему придется подождать и отправить событие, например, с вызовом 'epoll' в Linux. Я думаю, что вы правы, хотя это означает, что это HAS должно быть связано с циклом событий в любом случае, и я могу предотвратить окончание программы в этом eventloop, пока он не отправит все ожидающие события события. Спасибо за понимание! – crispyzeal

ответ

0

В C++ (в отличие от Java) программа заканчивается всякий раз, когда основной кончается. все остальные потоки прекращаются. утечки памяти не являются вашей проблемой, так как программа заканчивается в любом случае, и вся память освобождается.

вы можете использовать зЬй :: нитку станд :: Thread :: присоединиться, чтобы предотвратить программировать от выхода слишком рано:

int main (void){ 

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

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

вы можете быть заинтересованы, имеющий Thread бассейн в вашей программе.

Смежные вопросы