Перейти к публикации

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


Throwable

Рекомендованные сообщения

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

 

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

 

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

 

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

Ссылка на сообщение
Поделиться на других сайтах


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/

Ссылка на сообщение
Поделиться на других сайтах

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


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

Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

 

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

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

 

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

Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Ссылка на сообщение
Поделиться на других сайтах

@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 студия , если она установлена как расширение вижуал студии 
во всех других случаях приложения надо запускать для каждого конкретного кода 
оно его прочитает - и выведет вам сообщение об ошибках , 
в принципе все должно быть описано в руководстве - как пользоваться тем или иным приложением для анализа утечек ...





 

Изменено пользователем esergey
Ссылка на сообщение
Поделиться на других сайтах

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

 

#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;

}

 

Ссылка на сообщение
Поделиться на других сайтах

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

человек говорит о 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/

 

Изменено пользователем esergey
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.



×
×
  • Создать...