Задать вопрос
  • Почему метод класса С++ библиотеки в Debug под Mac OS X and Linux возвращает nullptr?

    @proydakov Автор вопроса
    1) Список инициализации не помогает. Помогает только перенос метода в .cpp
    2) TaskRunner удаляет клиента. Насколько я понял это коммент разработчиков либы чтобы в деструкторе не вызывать delete. За удалением следит TaskRunner
    3) Флаги добавил в вопрос
  • Почему метод класса С++ библиотеки в Debug под Mac OS X and Linux возвращает nullptr?

    @proydakov Автор вопроса
    Потоков много. Но точка создания и начала использования, в которой все падает, в одном потоке.

    Вот так создаю XmppPump и беру у него клиента:

    assert( ! m_pump );
    m_pump = new buzz::XmppPump( );
    auto xmppClient = m_pump->client( );
    assert( xmppClient ); // роковой assert для debug

    Весь .h XmppPump:

    #ifndef TALK_XMPP_XMPPPUMP_H_
    #define TALK_XMPP_XMPPPUMP_H_

    #include
    #include "talk/base/messagequeue.h"
    #include "talk/base/taskrunner.h"
    #include "talk/base/thread.h"
    #include "talk/base/timeutils.h"
    #include "talk/xmpp/xmppclient.h"
    #include "talk/xmpp/xmppengine.h"
    #include "talk/xmpp/xmpptask.h"

    namespace buzz {

    // Simple xmpp pump

    class XmppPumpNotify {
    public:
    virtual ~XmppPumpNotify() {}
    virtual void OnStateChange(buzz::XmppEngine::State state) = 0;
    };

    class XmppPump : public talk_base::MessageHandler, public talk_base::TaskRunner {
    public:
    XmppPump(buzz::XmppPumpNotify * notify = NULL);

    buzz::XmppClient *client() { std::cout << "GET XmppPump.client: " << client_ << std::endl; return client_; }

    void DoLogin(const buzz::XmppClientSettings & xcs,
    buzz::AsyncSocket* socket,
    buzz::PreXmppAuth* auth);
    void DoDisconnect();

    void OnStateChange(buzz::XmppEngine::State state);

    void WakeTasks();

    int64 CurrentTime();

    void OnMessage(talk_base::Message *pmsg);

    buzz::XmppReturnStatus SendStanza(const buzz::XmlElement *stanza);

    private:
    buzz::XmppClient *client_;
    buzz::XmppEngine::State state_;
    buzz::XmppPumpNotify *notify_;
    };

    } // namespace buzz

    #endif // TALK_XMPP_XMPPPUMP_H_

    Весь .cpp:

    #include
    #include "talk/xmpp/xmpppump.h"
    #include "talk/xmpp/xmppauth.h"

    namespace buzz {

    XmppPump::XmppPump(XmppPumpNotify * notify) {
    state_ = buzz::XmppEngine::STATE_NONE;
    notify_ = notify;
    client_ = new buzz::XmppClient(this); // NOTE: deleted by TaskRunner
    std::cout << "CREATE XmppPump.client: " << client_ << std::endl;
    }

    void XmppPump::DoLogin(const buzz::XmppClientSettings & xcs,
    buzz::AsyncSocket* socket,
    buzz::PreXmppAuth* auth) {
    OnStateChange(buzz::XmppEngine::STATE_START);
    if (!AllChildrenDone()) {
    client_->SignalStateChange.connect(this, &XmppPump::OnStateChange);
    client_->Connect(xcs, "", socket, auth);
    client_->Start();
    }
    }

    void XmppPump::DoDisconnect() {
    if (!AllChildrenDone())
    client_->Disconnect();
    OnStateChange(buzz::XmppEngine::STATE_CLOSED);
    }

    void XmppPump::OnStateChange(buzz::XmppEngine::State state) {
    if (state_ == state)
    return;
    state_ = state;
    if (notify_ != NULL)
    notify_->OnStateChange(state);
    }

    void XmppPump::WakeTasks() {
    talk_base::Thread::Current()->Post(this);
    }

    int64 XmppPump::CurrentTime() {
    return (int64)talk_base::Time();
    }

    void XmppPump::OnMessage(talk_base::Message *pmsg) {
    RunTasks();
    }

    buzz::XmppReturnStatus XmppPump::SendStanza(const buzz::XmlElement *stanza) {
    if (!AllChildrenDone())
    return client_->SendStanza(stanza);
    return buzz::XMPP_RETURN_BADSTATE;
    }

    } // namespace buzz
  • Как перехватить множество исключений в деструкторах при наследовании?

    @proydakov Автор вопроса
    Либо я хочу увидеть текст в стандарте С++, который скажет что это невозможно.
  • Как перехватить множество исключений в деструкторах при наследовании?

    @proydakov Автор вопроса
    Я с вами согласен. При работе я всегда использую try/catch в деструкторах.
    Вопрос из теории С++, такое обожают спрашивать на тестировании и собеседованиях.
    Сегодня столкнулся с вопросами по этим двум темам и смог придумать case с двумя исключениями в деструкторах, который вынес мозг не одному мне. Теперь ищу способ корректно перехватить все исключения без try/catch в деструкторах.