Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > как избежать дублирования ссылок на 1 объект


Автор: vadiml 1.11.2007, 12:02
есть perl объект, который является blessed ссылкой на C++ класс.
В нём вызывается функция, в которой один из возвращаемых параметров -- указатель на другой С++ класс (или даже этот, что всё равно).
Как узнать (где посмотреть), есть ли уже blessed ссылка на этот возвращаемый класс или это новый.

Проблема в том, что если будет 2 разных перл-ссылки на 1 С++ класс, то перл вызывает деструктор для них 2 раза, и после второго раза, соответственно,  выскакивает "Ошибка сегментирования"


например, есть C++ класс Application, который создается только 1 на программу (в нём есть static *self, и через него отслеживается уникальность класса на программу).
Я могу в любом месте вызвать static функцию app(), которая вернет self, для этой функции пишется xs:
Код

Application *
app()
  PREINIT:
    char * CLASS = "Application";
  CODE:
    RETVAL = Application::app();
  OUTPUT:
    RETVAL

на что я получу:
Код

XS(XS_Application_app); /* prototype to pass -Wmissing-prototypes */
XS(XS_Application_app)
{
    dXSARGS;
    if (items != 0)
        Perl_croak(aTHX_ "Usage: Application::app()");
    {
#line 269 "Application.xs"
        char *CLASS = "Application";
#line 419 "Application.c"
        Application *      RETVAL;
#line 271 "Application.xs"
        RETVAL = Application::app(  );
#line 423 "Application.c"
        ST(0) = sv_newmortal();
        sv_setref_pv( ST(0), CLASS, (void*)RETVAL );

    }
    XSRETURN(1);
}

но уже имея ссылку на класс Application (например Application=SCALAR(0xa021d20) )
я, вызвав эту функцию, получу новую ссылку Application=SCALAR(0xa021d32)
хотя обе они являются одним и тем же C++ классом
а на выходе из программы я получу ошибку сегментирования, т.к. перл вызовет DESTROY 2 раза, т.е. для каждой ссылки

Автор: vadiml 5.11.2007, 14:39
возможно наиболее близкое из того, что мне надо -- это stash
но как там получить нужно мне я не понял

наверное лучше завести под это дело хеш на уровне XS (т.е. map)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)