AddCtrl и boost::shared_ptr
  • ivstrivstr January 2012
    Как корректно удалить 2 вектора, состоящие из boost::shared_ptr?
    Существуют 2 вектора:

    std::vector> vec_ctrl (содержит указатели на элементы управления для интерфейсов GUI – различные производные классы от hgeGUIObject) и

    std::vector> vec_gui (указатели на gui интерфейсы).
    Создание векторов происходит в функции, которая вызывается из main.cpp.
    Элементы управления GUI добавляются в цикле

    (*igui).get()->AddCtrl((*ictrl).get());
    После этого из main.cpp вызываются bool FrameFunc() и bool RenderFunc().
    В конце программы при очистке векторов
    vec_ctrl.clear ();
    vec_gui.clear ();
    происходит ошибка - попытка удалить уже удаленный объект. Решить проблему через boost::weak_ptr не получилось (может, это у МЕНЯ не получилось). Пожалуйста, подскажите!
  • kvakvskvakvs January 2012
    boost::shared_ptr должен создаваться строго 1 раз, и все остальные вектора и прочие копии должны создаваться копированием первого указателя, тогда всё будет в порядке. Удалять можно в любом порядке, даже можно забыть про них, вектора сами при очистке всё удалят.

    Если ты где-то создаёшь его дважды то не удивляйся что первый грохает память, и второй тоже пытается сделать то же самое.
  • ivstrivstr January 2012
    Спасибо, kvakvs, за быстрый ответ. Пожалуйста, объясните новичку! Я убрала вектора и функции, чтобы понять суть.

    myCtrl = boost::shared_ptr (new MyhgeClass());

    gui = boost::shared_ptr (new hgeGUI());
    gui->SetNavMode(HGEGUI_LEFTRIGHT |HGEGUI_UPDOWN | HGEGUI_CYCLED);
    gui->SetCursor(sprCursor.get());

    gui.get()->AddCtrl((myCtrl).get());

    ошибка:
    Необработанное исключение в "0x013f0c42" в "my_project.exe": 0xC0000005: Нарушение прав доступа при чтении "0xfeeefeee".

    Я понимаю почему ошибка, но не понимаю как сделать, чтобы ее не было.
  • kvakvskvakvs January 2012
    Ты создал шаред пойнтер и нигде его не сохранил.
    При выходе из этой функции шаред будет думать что он последний, кто владеет памятью, и освободит её. Тогда HGE GUI упадёт с ошибкой 0xfeeefeee (доступ к только что освобождённой памяти).
    gui, myCtrl сохрани до конца работы с гуй.
  • ivstrivstr January 2012
    Не выходит все равно. Как добиться, чтобы при добавлении элемента управления myCtrl к gui с помощью AddCtrl счетчик ссылок myCtrl инкрементировался? Иначе по окончании работы удаляется myCtrl, а потом gui (который тоже содержит указатель на myCtrl) и, конечно, отсюда ошибка. Именно здесь проблема, где используется row-указатель.
  • kvakvskvakvs January 2012
    Используй boost::scoped_ptr или std::unique_ptr из С++11, очевидно shared здесь не подходит ;)

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Sign In Apply for Membership

In this Discussion

Tagged

Who's Online (1)