IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> тип string, утечка памяти, C++ Builder 6
TarasBer
сообщение 18.09.2009 15:35
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Работу с типом char* я тупо не смог осилить, так как так и не понял, при каких операциях надо выделять ему память, при каких не надо. Короче ужаснейший тип, и кто его придумал, и ну его нафиг.
Решил применить string - я так понял, что это аналог паскалевского. Но обнаружилось, что после динамического создания структуры, содержащей поле типа string, и её удаления кол-во занимаемой памяти меняется. Встатив этот кусок в бесконечный цикл, я обнаружил, что память, пожираемая программой, пульсирует от 10 до 50 MЬ.
Вторая проблема - при отладке на операциях с этим типом он лезет в свои модули, мне они неинтересны, как запретить отладчику в них влазить.
Блин, настроек по сравнению с Дельфой раза в 3 больше, на кой.

Сообщение отредактировано: TarasBer - 18.09.2009 15:41


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 18.09.2009 16:49
Сообщение #2


Гость






Цитата
так и не понял, при каких операциях надо выделять ему память, при каких не надо.
Выделять память надо всегда. Просто когда-то ее можно выделить самим фактом инициализации строки:
char *s = "my string";
, а иногда это приходится делать через new, то есть выделять память динамически.

Цитата
после динамического создания структуры, содержащей поле типа string, и её удаления кол-во занимаемой памяти меняется.
Можно посмотреть на структуру, и на то, как выделяется память? Что говорят средства отладки (скажем, тот же CodeGuard)?

Добавлено через 1 мин.
Цитата
Вторая проблема - при отладке на операциях с этим типом он лезет в свои модули, мне они неинтересны, как запретить отладчику в них влазить.
Не делать "Step Into", а пользоваться вместо этого "Step Over", тогда отладчик будет выполнять всю строку, а не по отдельным операциям.
 К началу страницы 
+ Ответить 
TarasBer
сообщение 18.09.2009 17:45
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(volvo @ 18.09.2009 17:49) *

Выделять память надо всегда. Просто когда-то ее можно выделить самим фактом инициализации строки:
char *s = "my string";
, а иногда это приходится делать через new, то есть выделять память динамически.


Но просто s = "my string" уже не катит. Что делают с памятью strcpy и strcat - тоже непонятно.

Цитата


Можно посмотреть на структуру, и на то, как выделяется память? Что говорят средства отладки (скажем, тот же CodeGuard)?



Ну например:
Код

struct S {
    string Name;        
};
...
S *s;
while(1){
    s = new S[8];
    delete s;
};

Прикол в том, что если заменить string на int, то утечка полностью исчезает.

В кодгуарде пока не разобрался.

Цитата



Добавлено через 1 мин.
Не делать "Step Into", а пользоваться вместо этого "Step Over", тогда отладчик будет выполнять всю строку, а не по отдельным операциям.

А если строка передаётся как параметр в функцию? Тогда степ овер пропусткает то, что делает функция, а это как раз не надо. А степ инто тут же залезает в дебри всякие.

Сообщение отредактировано: TarasBer - 18.09.2009 17:51


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
TarasBer   тип string, утечка памяти   18.09.2009 15:35
volvo   Выделять память надо всегда. Просто когда-то ее мо...   18.09.2009 16:49
TarasBer   Выделять память надо всегда. Просто когда-то ее м...   18.09.2009 17:45
volvo   Естественно... Для работы со строками в стиле С су...   18.09.2009 18:23
TarasBer   С чего бы? Ничего они не делают с памятью. В опис...   18.09.2009 18:43
volvo   До поры до времени - не вредят... Пока ты не напиш...   18.09.2009 19:05
TarasBer   Ну, тогда смотри: при выполнении delete, если до...   18.09.2009 20:05
volvo   Угу, именно поэтому... Кстати, а что за задачу ты...   18.09.2009 20:53
TarasBer   Кстати, а что за задачу ты решаешь? Я решаю зад...   18.09.2009 21:07
volvo   Фишка С++ - не в том, чтобы не писать свой велосип...   18.09.2009 21:29
TarasBer   Фишка С++ - не в том, чтобы не писать свой велоси...   18.09.2009 22:44
renesko1   С++ наоборот ИМХО понятен, если программа написана...   19.09.2009 14:29
TarasBer   Хьюстон, у нас опять проблемы. При вводе корректны...   19.09.2009 18:55
volvo   Где память выделяется, и где она освобождается? Ес...   19.09.2009 19:34
TarasBer   Естественно, все выделения и освобождения находятс...   19.09.2009 20:00
volvo   Ну, хорошо... Это переопределение операции деления...   19.09.2009 21:03
TarasBer   Значит собсна вычисление выражения выглядит так: ...   19.09.2009 21:23
volvo   Сомневаюсь... Поскольку сведения у меня о твоей пр...   19.09.2009 23:02
TarasBer   Запуск с гуардом даёт аксесс виолейшн, программа н...   20.09.2009 0:04
volvo   Присоедини свой проект, я его прогоню в 2009... Мо...   20.09.2009 0:10
TarasBer   Заодно я проверил, что дело не в "пустом...   20.09.2009 0:34
volvo   А ты знаешь, у меня не вылетает. У тебя вечный цик...   20.09.2009 1:21
TarasBer   > Так вот по 10 минут работало без перерыва, ни...   20.09.2009 12:10
TarasBer   И надо сказать, что хавает от не спеша, где-то пол...   20.09.2009 14:07
volvo   Ну не получается у меня, чтоб пожиралась память......   20.09.2009 14:52
TarasBer   А что это он сразу 8 метров отхватил? У меня в кор...   20.09.2009 15:07
volvo   Это Дебаг-версия + CodeGuard... Если скомпилироват...   20.09.2009 15:15
TarasBer   Я правильно понимаю, что команда new для создания ...   20.09.2009 18:20
TarasBer   Мне удалось подключить CodeGuard. Запустил, ввёл 1...   22.09.2009 22:17
TarasBer   Решил упростить свой случай до предела. Написал в ...   23.09.2009 13:12
volvo   Ничего там не создается... Проверил и Билдером, и ...   23.09.2009 13:57
TarasBer   Тогда ещё вопрос - как надо компилировать программ...   23.09.2009 14:16
volvo   нехватка Vcl50.bpl   23.09.2009 14:20
TarasBer   Понятно. Альтернативный вариант - чистое API? Екз...   23.09.2009 14:26
volvo   И в этом случае возможны проблемы (при отсутствии ...   23.09.2009 14:44
TarasBer   А просканировать как-нибудь тот екзешник, чтоб пон...   23.09.2009 20:31
volvo   Реально, только сравнивать надо не EXE-шники, а MA...   23.09.2009 21:52
TarasBer   А существует ли какой-либо механизм предсказания о...   24.09.2009 22:22
TarasBer   Попытался заняться дальнейшим упрощением "нев...   27.09.2009 13:30
volvo   Значит, в BCB6 такая "хорошая" работа с ...   27.09.2009 13:47
TarasBer   Значит, в BCB6 такая "хорошая" работа с...   27.09.2009 14:02
volvo   Чего сложного? http://www.codeblocks.org/downloads...   27.09.2009 14:09
volvo   Нет, этот баг нашел не ты, его нашли другие... Ты ...   27.09.2009 14:40
TarasBer   catch (Exception &E) { ... delete ...   28.09.2009 13:20
TarasBer   А такой код, с удалением исключения, будет работат...   28.09.2009 15:47
volvo   Нет, при попытке сделать delete &E;получишь In...   28.09.2009 19:01
TarasBer   Тогда какой #ифдеф на этот случай посоветуете? Я в...   28.09.2009 19:23
volvo   Насколько я помню номера компиляторов - так: cat...   28.09.2009 21:21
TarasBer   > && (__BORLANDC__ >= 0x560) Ну, во...   29.09.2009 9:35
volvo   Ты спрашивал, как определить Билдер 6 директивами ...   29.09.2009 10:04
TarasBer   Всё, больше вопросов нет, спасибо.   29.09.2009 13:45
TarasBer   Как заставить встроенные функции модуля math не вы...   29.09.2009 15:29
TarasBer   Заменил матх на фастматх, обнаружил новый прикол. ...   29.09.2009 20:28


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.06.2025 0:15
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"