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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.



×
×
  • Create New...