The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Утечка памяти std::string"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Утечка памяти std::string"  
Сообщение от Дмитрий (??) on 21-Мрт-06, 18:15 
Доброго времени суток.
По долгу службы приходится работать с std::string и выходит, что есть в реализации утечка памяти (использую libstdc++-3.2.2 и gcc-3.2.2). На форуме обсуждался этот вопрос - приводился следующий пример:

int main(void)
{
string s;
s = "any text";
return 0;
}

Автор утверждал, что утечка есть и я с ним согласен, для проверки я использовал mtrace и вот, что он выдает:

Memory not freed:
-----------------
   Address     Size     Caller
0x08075958    0x3c0  at 0x40202e9e

Использование ~string или clear положительного результата не дают.
Если у кого-то есть мысли по этому поводу, поделитесь, пожалуйста.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Утечка памяти std::string"  
Сообщение от Hordi email on 21-Мрт-06, 22:35 
Тогда давай сразу говорить о том, что mtrace показывает некорректную инфу... Кстати, давай полный код, т.к. у меня ничего подобного не наблюдается.
Код string однозначный - все корректно, аллокаторы и деаллокаторы вызываются (честно говоря и мысли не возникает сомневаться).
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Утечка памяти std::string"  
Сообщение от Дмитрий (??) on 21-Мрт-06, 22:59 
у меня тоже не было мысли сомневать, но ...
вот собственно код

#include <iostream>
#include "mcheck.h"

int main(){
  mtrace();

  std::string s;
  s = "any text";

  muntrace();
}

и еще вопрос, какая утилита показывает корректную инфу по утечкам памяти?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Утечка памяти std::string"  
Сообщение от gyn61 (ok) on 22-Мрт-06, 00:07 
>у меня тоже не было мысли сомневать, но ...
>вот собственно код
>
>#include <iostream>
>#include "mcheck.h"
>
>int main(){
>  mtrace();
>
>  std::string s;
>  s = "any text";
>
>  muntrace();
>}
>

Нет возможности попробовать, но если:

#include <iostream>
#include "mcheck.h"

void test() {
  std::string s;
  s = "any text";
}

int main(){
  mtrace();
  test();
  muntrace();
}

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. "Утечка памяти std::string"  
Сообщение от Дмитрий (??) on 22-Мрт-06, 08:46 
>Нет возможности попробовать, но если:
>
>#include <iostream>
>#include "mcheck.h"
>
>void test() {
>  std::string s;
>  s = "any text";
>}
>
>int main(){
>  mtrace();
>  test();
>  muntrace();
>}
тоже самое

Memory not freed:
-----------------
   Address     Size     Caller
0x08049e10    0x3c0  at 0x400ace9e

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

6. "Утечка памяти std::string"  
Сообщение от Hordi email on 22-Мрт-06, 10:25 
Я это ради интереса попробовал - у меня пишет все корректно (+,-).
glibc-2.3.6, gcc-3.4.5
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

7. "Утечка памяти std::string"  
Сообщение от Дмитрий (??) on 22-Мрт-06, 16:23 
>Я это ради интереса попробовал - у меня пишет все корректно (+,-).
>
>glibc-2.3.6, gcc-3.4.5
странно...
для того, чтобы отловить утечку с помощью mtrace надо:
1. создать файл, куда будет складываться инфа о выделении и освобождении памяти.
2. создать переменную среды MALLOC_TRACE, которая будет указывать на созданный файл
3. запустить программу
4. запусить mtrace, указав программу и имя файла с данными о выделении и освобождении памяти.
Если ты выполнил все шаги, и у тебя все корректно - это странно.
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

5. "Утечка памяти std::string"  
Сообщение от DeadMustdie email(??) on 22-Мрт-06, 09:22 
Это не то чтобы утечка, это то, что кажется mtrace()'у утечкой. libstdc++ при своей инициализации (std::string сам по себе ни при чём) выделяет некий базовый блок памяти для работы собственного аллокатора. Поскольку время жизни этого блока равно времени жизни программы, нет особого смысла его освобождать. Вообще, чтобы ловить утечки памяти в C++ программах с помощью mtrace(), при использовании GCC 3.2 и выше необходимо выставить переменную окружения GLIBCPP_FORCE_NEW.

В целом могу порекомендовать использовать valgrind. Он, по крайней мере, покажет точку, нде была выделена "утекшая" память.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

8. "Утечка памяти std::string"  
Сообщение от Дмитрий (??) on 22-Мрт-06, 16:31 
>Это не то чтобы утечка, это то, что кажется mtrace()'у утечкой. libstdc++
>при своей инициализации (std::string сам по себе ни при чём) выделяет
>некий базовый блок памяти для работы собственного аллокатора. Поскольку время жизни
>этого блока равно времени жизни программы, нет особого смысла его освобождать.
>Вообще, чтобы ловить утечки памяти в C++ программах с помощью mtrace(),
>при использовании GCC 3.2 и выше необходимо выставить переменную окружения GLIBCPP_FORCE_NEW.
>
>
>В целом могу порекомендовать использовать valgrind. Он, по крайней мере, покажет точку,
>нде была выделена "утекшая" память.

переменную среды я выставляю.
У меня в таком случае появляется вопросы:
libstdc++ выделяет аллокатор или это делает std::string? (будет ли создан второй аллокатор, если я создам вторую строку?)
Размер памяти, выделяемый под аллокатор постоянен? (если я ввожу более длинную строку - размер неосвобожденной памяти увеливается)

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

9. "Утечка памяти std::string"  
Сообщение от kir (??) on 22-Мрт-06, 17:27 
почему бы вам самому не посмотреть в библиотеку std
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

10. "Утечка памяти std::string"  
Сообщение от DeadMustdie email(??) on 22-Мрт-06, 20:36 
>переменную среды я выставляю.
>У меня в таком случае появляется вопросы:
>libstdc++ выделяет аллокатор или это делает std::string? (будет ли создан второй аллокатор,
>если я создам вторую строку?)

Нет, разумеется.

>Размер памяти, выделяемый под аллокатор постоянен? (если я ввожу более длинную строку
>- размер неосвобожденной памяти увеливается)

Вот это странно. Если так, возможно, на конкретно вашей системе какой-то кривой
libstdc++. Для проверки можно использовать прилагаемый код (если объём памяти,
используемой программой по данным top либо, скажем, ps -F, будет расти, значит,
имеет место быть некое безобразие). Стопарится прога по Ctrl+C, естественно.

#include <string>
#include <stdio.h>

int main()
{
  try {
    while ( true ) {
      std::string s1;
      for ( int i=0; i<20; ++i ) {
        std::string s2(" *** a *** ");
        s2 = s1 + s2;
        s1 += s2;
      }
      fputc('.', stdout); fflush(stdout);
    }
  } catch(const std::exception& e) {
    printf("Die, human!\n");
  }
  return 0;
}

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

11. "Утечка памяти std::string"  
Сообщение от Дмитрий (??) on 22-Мрт-06, 22:07 
Роста объема памяти я не наблюдаю - все нормально. Быстрее всего это mtrace глючит. Да и на valgrind.org написано, что не надо напрягаться по этому поводу: стандартная библиотека плюсов использует свои распределители пулов памяти, которые она не освобождает для дальнейшего использования.

Спасибо за отзывчивость и потраченное время.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру