|
|
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Сделал dll, с двумя внешими функциями f1(a,b,c), f2(a,b) (в этой библиотеке), где a,b - это CString. Внутри есть также функция g(). К ней я обращаюсь из f1(a,b,c) и f2(a,b). Во внешнем exe-нике я использую f1(a,b,c) и f2(a,b), причем подряд и первые два параметра совпадают. Дебагер сообщает об утечке памяти, причем именно a и b. Любопытно, что в каждой из функции я явно не выделяю память вообще, поэтому неясно, что уничтожать. Пробовал писать одну(любую) функцию, даже несколько раз подряд-утечки нет. И наоборот, первую и вторую подряд несколько раз. Утечка только одной пары a,b. Это сбивает с толку и совершенно неясно в чем дело. Возможно, я неправильно загружаю библиотеку. (просто подключаю .lib файл)? В общем, вопрос в том как происходит утечка, и, соответственно, как сэтим справиться? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2004, 23:30 |
|
||
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
Cергей1111Здравствуйте. Сделал dll, с двумя внешими функциями f1(a,b,c), f2(a,b) (в этой библиотеке), где a,b - это CString. Внутри есть также функция g(). К ней я обращаюсь из f1(a,b,c) и f2(a,b). Во внешнем exe-нике я использую f1(a,b,c) и f2(a,b), причем подряд и первые два параметра совпадают. Дебагер сообщает об утечке памяти, причем именно a и b. Любопытно, что в каждой из функции я явно не выделяю память вообще, поэтому неясно, что уничтожать. Пробовал писать одну(любую) функцию, даже несколько раз подряд-утечки нет. И наоборот, первую и вторую подряд несколько раз. Утечка только одной пары a,b. Это сбивает с толку и совершенно неясно в чем дело. Возможно, я неправильно загружаю библиотеку. (просто подключаю .lib файл)? В общем, вопрос в том как происходит утечка, и, соответственно, как сэтим справиться? Заранее спасибо. Насчет подключения .lib-файла. Это называется "статическая прилинковка dll" и является допустимым во всех отношениях :) Насчет "как происходит утечка". Вероятно, неявно создаются переменные типа CString, которые затем не уничтожаются... Насчет справиться. Вероятно, проблем не будет если: - передавать в качестве параметров не CString, а const char*... - изменить квалификатор функции, то есть сделать ее не типа extern "C" ... , а другого экспортируемого типа (в С++Builder это тип _dllexport; как это будет в VC, к сожалению, не знаю)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 07:07 |
|
||
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
Станислав C.(в С++Builder это тип _dllexport; как это будет в VC, к сожалению, не знаю)... Sorry, за мою ошибку. Сейчас прочитал поподробнее. Оказалось, что extern "C" и _declspec(dllexport) (так правильно, а не как в моем посте) из разных "опер"... Так что этот вариант снимаю. Еще раз: Sorry! :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 07:57 |
|
||
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
- передавать в качестве параметров не CString, а const char*... Считаю этот совет НЕУМЕСТНЫМ. Я не поклонник библитеки MFC но по моему класс CString создавался с целью - МИНИМИЗИРОВАТЬ проблемы утечки памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 16:19 |
|
||
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
2Cергей1111 Дебагер сообщает об утечке памяти, причем именно a и b. Обычно в таком случае дебаггер сообщает о строке, в которой стоИт new. А тут, что это за строка? В ехе или в dll? При работе под отладчиком удаётся ли поставить остановы внутри функций f1 и f2? (иначе говоря, загружается ли самая свежая библиотека при запуске exe и есть ли связь с её текстами). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2004, 14:09 |
|
||
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
Ой Вэй2Cергей1111 Дебагер сообщает об утечке памяти, причем именно a и b. Обычно в таком случае дебаггер сообщает о строке, в которой стоИт new. А тут, что это за строка? В ехе или в dll? При работе под отладчиком удаётся ли поставить остановы внутри функций f1 и f2? (иначе говоря, загружается ли самая свежая библиотека при запуске exe и есть ли связь с её текстами). Понимаешь, в том-то и дело, что дебаггер ссылается на файл strcore.cpp, который входит в MFC для работы с CString: CStringData* pData =(CStringData*)new BYTE[sizeof(CStringData) + (nLen+1)*sizeof(TCHAR)]; Ошибка: strcore.cpp(76) : {67} normal block at 0x007618C0, 36 bytes long. Data: < D:\E> 01 00 00 00 17 00 00 00 17 00 00 00 44 3A 5C 45 - это для b, аналогично для a. Остановы удается поставить во всех местах. За картой памяти тоже отследить возможно - что и по каким адресам и в какой момент. Судя по всему, в exe и dl явно выделенная память удаляется, иначе бы утечка появлялась бы и при одной функции. Значит, память выделяется неявно при вызове, но функции обявляются как __cdecl, т.е. функции объявлены одинаково. Но тем не менее память память где-то "протекает". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2004, 14:58 |
|
||
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
Параметры у функций именно CString, а на const CString или CString& ? Нельзя ли опубликовать прототипы? И как ехе узнаёт эти прототипы при трансляции -- h-файл или копия прототипа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2004, 15:06 |
|
||
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
Ой ВэйПараметры у функций именно CString, а на const CString или CString& ? Нельзя ли опубликовать прототипы? И как ехе узнаёт эти прототипы при трансляции -- h-файл или копия прототипа? Я не совсем понял насчет публикации прототипов. Покажу как я подключал 1. Подключение статическое - линнкую .lib файл 2. В h -файле exe: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 3. Dll: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2004, 16:52 |
|
||
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
Под публикацией протоколов я подразумевал их демонстрацию здесь, в треде. Это уже произошло :) Моей квалификации тут, увы, недостаточно... Я бы убрал слово "С" из объявления функций. Оно или ничего не добавляет, или противоречит тому, что на самом деле они с++. Я бы убрал и слово "extern" из обоих файлов. А ещё лучше -- подключал бы один и тот же h-файл к ехе и dll, а в нём бы написал Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2004, 17:40 |
|
||
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
Ой ВэйПод публикацией протоколов я подразумевал их демонстрацию здесь, в треде. Это уже произошло :) Моей квалификации тут, увы, недостаточно... Я бы убрал слово "С" из объявления функций. Оно или ничего не добавляет, или противоречит тому, что на самом деле они с++. Я бы убрал и слово "extern" из обоих файлов. А ещё лучше -- подключал бы один и тот же h-файл к ехе и dll, а в нём бы написал Код: plaintext Ты не поверишь, что произошло. Похоже это MFC - ый глюк. Сделал передачу первых двух параметров по ссылке и все нормально. Ощущение такое, что когда передаешь CString по значению стэк не очищаяется корректно в дебаг-версии (идиотизм ;)). Огромное спасибо за советы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2004, 18:19 |
|
||
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
Cергей1111Ты не поверишь, что произошло. Похоже это MFC - ый глюк. Сделал передачу первых двух параметров по ссылке и все нормально. Ощущение такое, что когда передаешь CString по значению стэк не очищаяется корректно в дебаг-версии (идиотизм ;)). Огромное спасибо за советы. Скорее всего, это ваш глюк. А именно, эти два модуля (dll/exe) используют разные версии MCVCRT или MFC - одна Debug, другая - Release. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2004, 18:35 |
|
||
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
Поверю, конечно. При передаче по ссылке не создаётся копия CString, вот и всё. Глюки в MFC бывают, но шансов что ты на них попадёшь в такой простой ситуации — нуль. Про Debug и Release из предыдущего поста очень советую проверить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2004, 19:23 |
|
||
|
Visual C (DevStudio), утечка памяти
|
|||
|---|---|---|---|
|
#18+
авторТы не поверишь, что произошло. За последний год нашёл 2 MFC-шных глюка. Первый уже не помню, второй - делать постмессаж WM_COMMAND окну при этом подымать с него попаное дитя - дитя отлавливает этот WM_COMMAND с чистой совестью :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2004, 10:34 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32807767&tid=2034022]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 377ms |

| 0 / 0 |
