Jump to content

Поиск утечек памяти, detect memory leaks


Throwable

Recommended Posts

Всем привет. Программирую серверную часть на C++. Соответственно, забываю чистить то, что выделяю. Плюс есть огромный легаси за 10 лет работы других людей над серверной частью.

 

Подскажите, пожалуйста, как и чем автоматически искать утечки памяти?

 

Пробовал VLD и CRT – не работают, не выводят ничего в логи.

 

У меня есть exe, а есть dll

Link to post
Share on other sites


UnPinned posts

Выделяите с помощью умных указателей 
https://habr.com/ru/companies/piter/articles/706866/
https://learn.microsoft.com/ru-ru/cpp/cpp/smart-pointers-modern-cpp?view=msvc-170

так же на утечки памяти укажет https://pvs-studio.ru/ru/blog/posts/cpp/0543/

  • Нравится 1
Link to post
Share on other sites

насколько я понял вы же пишите пользовательские расширения ? В этом случае утечки памяти не так сильно страшны - пользователь открыл расширение - оно получило данные с сервера , 
пользователь закрыл расширение - вся память , выделенная расширению , вместе с его полученными данными и не очищенными переменными или контеинерами,  освободилась . 
даже если что то там и было выделено и не очищено - память так и так освободится ...


а вот если вы делаете взаимодеиствие серверной части с пользовательскими приложениями и по запросу пользовательских приложении серверная сторона уже что то выделяет для них - тут уже надо следить что происходит после выхода пользователя или закрытия его расширения , так как при этом уже серверная сторона должна освобождать память , выделенную под данные , которыми пользовался user . В противном случае эти данные повиснут в памяти серверной части ...
 

Link to post
Share on other sites

@esergey, здравствуйте, спасибо за ваш ответ.

 

Смотрите, я пишу обработчики для бизнес-процессов Teamcenter 10.

 

Вот, например, у меня есть функция в API TCe AOM_ask_value_string() (в папке include, корня TeamCenter лежит файл aom.h)

 

Эта функция требует на вход одним из параметров **char. Соответственно, я создаю "char* user_name;"

Когда обработчик закончит свою работу, неужели он очистит память?

 

Далее, в API предоставлена функция MEM_free(), принимает указатели, чистит память. Вот.

Link to post
Share on other sites

А ещё, кстати, помечено, что АПИ пишет данные в указатели, которые мы передаём. В доке они помечены (OF), и их нужно чистить MEM_free. Если указатель является NULL. То проигнорится.

 

Так вот, в обработчиках у меня бывает по 5-8 указателей. Я утомляюсь всех чистить и за всеми следить. Как можно автоматически детектить?

Link to post
Share on other sites

@Throwable Смотрите - вы пишите расширения которые используют пользователи  - я правильно понимаю ? 
Если да то  - пользователь запускает расширение , екзе или длл , создается процесс , в котором это приложение исполняется , под этот процесс система выделяет память , прально ? Пользователь вышел из приложения  - система вернула память выделенную для процесса ! Все !
Вся память , которую вы выделили в своем приложении для char * так же освободилась ... 

 

если вы используете New - и не уверены что данные в куче принадлежат процессу пользовательского приложения  - используите умные указатели под эти данные ...


они сами следят за памятью , никто вам не мешает использовать более совершенные стандарты типа С++17 , но при этом писать в той версии , которая вам более знакома , например с++11 ... Но при этом вы можете использовать возможности современного с++.
Например отказаться от массивов  - используя вектор С++ , вектор сам следит за памятью ...
Все контеинеры STL не требуют их очищать и следить за памятью , используемой ими .

char* - используите std::string  - тоже не надо следить за памятью ... 

функция требует на вход char* - используите сишное преобразование 

std::string s = "";

передаите в функцию (char*)s или современные касты с++ https://habr.com/ru/articles/266747/ или https://en.cppreference.com/w/cpp/language/static_cast
там ниже про приведение к другим типам 

вывести строку - используите printf s.c_str();
современный std::cout << s 

ну и ещё возможность  - зона видимости переменной 
все что попадает в скобки уничтожается посл закрытия скобок 

{

std::string s = "";

char* лалала

}
 

здесь уже нет ничего из того что объявлено в скобках 

Это что касается тех данных , как я писал выше - которые используются расширением пользовательским...


Если вы пишите расширение северной части  - я понял так что обработчики это то, что делает уже серверная часть ТС 
то или используите под это дело умные указатели , и не парьтесь с отслеживанием утечек памяти  - все будет сделано за вас 
либо хотите если чистить как у них написано и следить за этим - тогда софт типа PVS студии или специфичный с гитхаба 
там есть много по запросу отслеживания утечки памяти https://github.com/topics/memory-leak-detection


и то  - автоматически анализирует утечки и покажет ошибки прямо в панели вывода вижуал студии -  PVS студия , если она установлена как расширение вижуал студии 
во всех других случаях приложения надо запускать для каждого конкретного кода 
оно его прочитает - и выведет вам сообщение об ошибках , 
в принципе все должно быть описано в руководстве - как пользоваться тем или иным приложением для анализа утечек ...





 

Edited by esergey
  • Чемпион 1
Link to post
Share on other sites

вот проще пример наверное привести одного из вариантов как можно использовать зону видимости переменной в куче

 

#include <iostream>

class Foo
{
public:
    Foo()
    {
        std::cout << "Foo()" << std::endl;
    }
    int a = 10 ;
};

int main ()
{
    // здесь крутится ваше серверное приложение ...
    
    {
        // здесь вам нужно использовать что то для обработчика из данных по указателю в памяти ...
        // зона видиости указателя и данных ограничена скобками , внутри которых указатель доступен ...
        Foo *bar = new Foo;
        std::cout << bar->a << std::endl;
    }
    
    // и здесь продолжает крутиться ваше серверное приложение ...
  
  
    // но за скобками bar уже нет - он уничтожен !!! и вы получите ошибку компиляции ...
    // error: 'bar' was not declared in this scope|
    std::cout << bar->a << std::endl;

}

 

  • Нравится 1
Link to post
Share on other sites

вот как раз смотрю видео 

человек говорит о New и прочих вариантах использования памяти ... 


видео всплыло в ленте на ютубе ...


создается такое стоикое  ощущение, что браузеры не только следят за поисковыми запросами, но и контролируют полностью текст , который пользователь читает или пишет на просторах нета, 
независимо от того,  зарегистрирован он где либо на саите или нет 
это полный атас для приватности частной жизни ...

 

но это факт  - замечал совпадение это уже не раз 

 

 


полезные ссылки по нему для памяти 
https://learn.microsoft.com/ru-ru/cpp/sanitizers/asan?view=msvc-170
https://github.com/google/sanitizers/wiki/AddressSanitizer

https://github.com/google/sanitizers
https://habr.com/ru/articles/323380/

 

так же вот 
https://ru.wikipedia.org/wiki/Valgrind

и вот 
http://cppstudio.com/post/4348/

 

Edited by esergey
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.




×
×
  • Create New...