Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как избежать дублирования ссылок на 1 объект, Perl XS, C++  
:(
    Опции темы
vadiml
Дата 1.11.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



есть 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 раза, т.е. для каждой ссылки

PM MAIL Jabber   Вверх
vadiml
Дата 5.11.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



возможно наиболее близкое из того, что мне надо -- это stash
но как там получить нужно мне я не понял

наверное лучше завести под это дело хеш на уровне XS (т.е. map)
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0388 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.