Languages

Menu
Sites
Language
проблема перегрузки глобальных операторов new и delete
Запуская простейшее приложение как это:
#include <new>
#include <stdlib.h>
#include <FBaseLog.h>
#include <FBaseColArrayList.h>

static bool MEM_LOG = false;
void *operator new(::size_t size) throw(std::bad_alloc)                 { if (MEM_LOG) { AppLog("%d", size); } return ::malloc(size); }
void *operator new [] (::size_t size) throw(std::bad_alloc)             { if (MEM_LOG) { AppLog("%d", size); } return ::malloc(size); }
void *operator new(::size_t size, const ::std::nothrow_t &) throw()     { if (MEM_LOG) { AppLog("%d", size); } return ::malloc(size); }
void *operator new [] (::size_t size, const ::std::nothrow_t &) throw() { if (MEM_LOG) { AppLog("%d", size); } return ::malloc(size); }

void operator delete(void *p) throw()                               { if (MEM_LOG) { AppLog("%p", p); } ::free(p); }
void operator delete [] (void *p) throw()                           { if (MEM_LOG) { AppLog("%p", p); } ::free(p); }
void operator delete(void *p, const ::std::nothrow_t &) throw()     { if (MEM_LOG) { AppLog("%p", p); } ::free(p); }
void operator delete [] (void *p, const ::std::nothrow_t &) throw() { if (MEM_LOG) { AppLog("%p", p); } ::free(p); }

void dump_global_new_delete_override_for_system_class() {
    MEM_LOG = true;
    AppLog("================================================================");
    Tizen::Base::Collection::ArrayList* p = new Tizen::Base::Collection::ArrayList();
    p->Construct();
    delete p;
    AppLog("================================================================");
    MEM_LOG = false;
}

extern "C" _EXPORT_ int OspMain(int argc, char *pArgv[]) {
    AppLog("Application started.");
    dump_global_new_delete_override_for_system_class();
    return 0;
}
получаем различные результаты в логах в зависимости от запуска под дебаггером или без: Когда запускаем под дебаггером (или через 'sdb launch -m debug'), в логе, то, то я ожидаю:
06-13 17:37:53.165 : INFO / SpikeGlobalNewDelete ( 5865 : 5865 ) : int OspMain(int, char **)(28) > Application started.
06-13 17:37:53.165 : INFO / SpikeGlobalNewDelete ( 5865 : 5865 ) : void dump_global_new_delete_override_for_system_class()(19) > ================================================================
06-13 17:37:53.165 : INFO / SpikeGlobalNewDelete ( 5865 : 5865 ) : void *operator new(::size_t)(7) > 36
06-13 17:37:53.165 : INFO / SpikeGlobalNewDelete ( 5865 : 5865 ) : void *operator new[](::size_t, const ::std::nothrow_t &)(10) > 40
06-13 17:37:53.165 : INFO / SpikeGlobalNewDelete ( 5865 : 5865 ) : void operator delete[](void *)(13) > 0x2a027c20
06-13 17:37:53.165 : INFO / SpikeGlobalNewDelete ( 5865 : 5865 ) : void operator delete(void *)(12) > 0x2a010b70
06-13 17:37:53.165 : INFO / SpikeGlobalNewDelete ( 5865 : 5865 ) : void dump_global_new_delete_override_for_system_class()(23) > ================================================================
Но когда запускаем в run mode (или 'sdb launch -m run' или тапая иконку на девайсе), лог содержит только:
06-13 17:38:08.540 : INFO / SpikeGlobalNewDelete ( 5879 : 5879 ) : int OspMain(int, char **)(28) > Application started.
06-13 17:38:08.540 : INFO / SpikeGlobalNewDelete ( 5879 : 5879 ) : void dump_global_new_delete_override_for_system_class()(19) > ================================================================
06-13 17:38:08.540 : INFO / SpikeGlobalNewDelete ( 5879 : 5879 ) : void *operator new(::size_t)(7) > 36
06-13 17:38:08.540 : INFO / SpikeGlobalNewDelete ( 5879 : 5879 ) : void dump_global_new_delete_override_for_system_class()(23) > ================================================================
Не вызываются перегруженные операторы если их запуск расположен в динамически подгруженной библиотеке (в примере это ArrayList из 'libosp-appfw.so'). Проблема проявляется как на реальном девайсе так и в эмуляторе. Похоже, что undefined символы из динамических библиотек (н-р new/delete - _Znaj/_ZnajRKSt9nothrow/_ZdaPv/etc) остаются слинкованными с реализацией из "libstdc++.so", вместо того, чтобы использовать определенные мной. Почему так происходит только при запустке? Почему в дебаггере другое, но корректное поведение? Как правильно перегрузить глобыльные операторы new и delete на Tizen платформе?  

Responses

1 Replies
kavish
It will be good to post your query in English . In Russian language only Russian people can help you out.