CORBA :: ORB_init утечка памяти - PullRequest
0 голосов
/ 05 июля 2019

У меня есть проект, который использует Службу именования TAO (CORBA) для обмена информацией между различными модулями. Тем не менее, я обнаружил, что моя реализация службы именования вызвала утечку памяти, обнаруженную моим программным обеспечением для обнаружения утечки памяти (Parasoft).

В целях тестирования я создал небольшой пример проекта.

int main (int argc, ACE_TCHAR ** const argv)
{
    std::cout << "start of main" << std::endl;

    CORBA::ORB_ptr myOrb = CORBA::ORB_init(argc, argv);
    CORBA::release(myOrb);
    myORB->destroy();

    std::cout << "end of main" << std::endl;
}

Когда я запустил свое программное обеспечение для обнаружения утечек памяти, было обнаружено, что ORB_init утечка памяти. Однако, как видно из примера кода, все, что я сделал, это инициировал ORB, а затем сразу же выпустил и уничтожил его. Есть ли какие-либо другие шаги для освобождения выделенных ORB ресурсов изнутри?

Одна из утечек:

12 байтов 1 выделенный блок

malloc () (интерфейс)

оператор new ()

CORBA :: string_alloc () String_Alloc.cpp, 53

CORBA :: string_dup () String_Alloc.cpp, 38

TAO_Default_Resource_Factory :: get parser_names () default_resources.cpp, 590

TAO_Parser_Registry :: open () Parser_Registry.cpp, 40

TAO_ORB_Core :: init () /home/user/ACE_Wrappers/ace/Arg_Shifter.cpp, 1291

CORBA :: ORB_init () ORB.cpp 1359

main () ..src / AlphaTest.cpp, 34

У меня есть только контроль над src / AlphaTest.cpp, остальные файлы TAO.

1 Ответ

0 голосов
/ 25 июля 2019

Утечка, которую вы показываете, связана с глобальным синглтоном, который очищается при выходе из процесса и не увеличивает память во время выполнения. Весьма вероятно, что проблема в коде вашего приложения. Скорее всего, вы неправильно используете отображение языка CORBA IDL в C ++. Ваш пример кода неверен в этом отношении, он должен выглядеть следующим образом

int main (int argc, ACE_TCHAR * const argv[])
{
    std::cout << "start of main" << std::endl;

    CORBA::ORB_var myOrb = CORBA::ORB_init(argc, argv);
    myORB->destroy();

    std::cout << "end of main" << std::endl;
}
...