powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Visual C (DevStudio), утечка памяти
14 сообщений из 14, страница 1 из 1
Visual C (DevStudio), утечка памяти
    #32802982
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 файл)?
В общем, вопрос в том как происходит утечка, и, соответственно, как сэтим справиться?
Заранее спасибо.
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32803050
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, к сожалению, не знаю)...
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32803072
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав C.(в С++Builder это тип _dllexport; как это будет в VC, к сожалению, не знаю)...
Sorry, за мою ошибку. Сейчас прочитал поподробнее. Оказалось, что extern "C" и _declspec(dllexport) (так правильно, а не как в моем посте) из разных "опер"...
Так что этот вариант снимаю.
Еще раз: Sorry! :(
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32804368
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- передавать в качестве параметров не CString, а const char*...


Считаю этот совет НЕУМЕСТНЫМ. Я не поклонник библитеки MFC но по моему класс CString создавался с целью - МИНИМИЗИРОВАТЬ проблемы утечки памяти.
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32807628
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Cергей1111
Дебагер сообщает об утечке памяти, причем именно a и b.
Обычно в таком случае дебаггер сообщает о строке, в которой стоИт new. А тут, что это за строка? В ехе или в dll?
При работе под отладчиком удаётся ли поставить остановы внутри функций f1 и f2? (иначе говоря, загружается ли самая свежая библиотека при запуске exe и есть ли связь с её текстами).
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32807767
Cергей1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой Вэй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, т.е. функции объявлены одинаково. Но тем не менее память память где-то "протекает".
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32807790
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Параметры у функций именно CString, а на const CString или CString& ?
Нельзя ли опубликовать прототипы? И как ехе узнаёт эти прототипы при трансляции -- h-файл или копия прототипа?
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32808050
Cергей1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой ВэйПараметры у функций именно CString, а на const CString или CString& ?
Нельзя ли опубликовать прототипы? И как ехе узнаёт эти прототипы при трансляции -- h-файл или копия прототипа?
Я не совсем понял насчет публикации прототипов. Покажу как я подключал
1. Подключение статическое - линнкую .lib файл
2. В h -файле exe:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
extern "C"  { _declspec(dllimport)
bool __cdecl  ReadRowRel(CString filename,CString sheetname, int row, int* data);
}
//
extern "C"  { _declspec(dllimport)
int __cdecl NumberOfRows(CString filename,CString sheetname);
} 
Это и есть f1 и f2, (первые два параметра совпвадают). Параметры передаются не по ссылке и не константные.
3. Dll:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
extern "C" _declspec(dllexport)
bool __cdecl  ReadRowRel(CString filename,CString sheetname, int row, int* data)
{
....
}
///
extern "C" _declspec(dllexport)
int __cdecl  NumberOfRows(CString filename,CString sheetname)
{
....
}
 __cdecl  можно везде и не ставить-ничего не меняется.
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32808195
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под публикацией протоколов я подразумевал их демонстрацию здесь, в треде. Это уже произошло :)

Моей квалификации тут, увы, недостаточно...

Я бы убрал слово "С" из объявления функций. Оно или ничего не добавляет, или противоречит тому, что на самом деле они с++.
Я бы убрал и слово "extern" из обоих файлов.
А ещё лучше -- подключал бы один и тот же h-файл к ехе и dll, а в нём бы написал
Код: plaintext
AFX_EXT_API bool ReadRowRel(CString filename,CString sheetname, int row, int* data);
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32808302
Cергей1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой ВэйПод публикацией протоколов я подразумевал их демонстрацию здесь, в треде. Это уже произошло :)

Моей квалификации тут, увы, недостаточно...

Я бы убрал слово "С" из объявления функций. Оно или ничего не добавляет, или противоречит тому, что на самом деле они с++.
Я бы убрал и слово "extern" из обоих файлов.
А ещё лучше -- подключал бы один и тот же h-файл к ехе и dll, а в нём бы написал
Код: plaintext
AFX_EXT_API bool ReadRowRel(CString filename,CString sheetname, int row, int* data);

Ты не поверишь, что произошло. Похоже это MFC - ый глюк. Сделал передачу первых двух параметров по ссылке и все нормально. Ощущение такое, что когда передаешь CString по значению стэк не очищаяется корректно в дебаг-версии (идиотизм ;)).
Огромное спасибо за советы.
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32808316
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cергей1111Ты не поверишь, что произошло. Похоже это MFC - ый глюк. Сделал передачу первых двух параметров по ссылке и все нормально. Ощущение такое, что когда передаешь CString по значению стэк не очищаяется корректно в дебаг-версии (идиотизм ;)).
Огромное спасибо за советы.

Скорее всего, это ваш глюк. А именно, эти два модуля (dll/exe) используют разные версии MCVCRT или MFC - одна Debug, другая - Release.
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32808380
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поверю, конечно. При передаче по ссылке не создаётся копия CString, вот и всё. Глюки в MFC бывают, но шансов что ты на них попадёшь в такой простой ситуации — нуль. Про Debug и Release из предыдущего поста очень советую проверить.
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32813850
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторТы не поверишь, что произошло.
За последний год нашёл 2 MFC-шных глюка. Первый уже не помню, второй - делать постмессаж WM_COMMAND окну при этом подымать с него попаное дитя - дитя отлавливает этот WM_COMMAND с чистой совестью :(
...
Рейтинг: 0 / 0
Visual C (DevStudio), утечка памяти
    #32814269
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MFC глюков было много. Но после 4-ки их все выловили в основном.
Так что если вы нашли какой-то "глюк в MFC" - скорее всего, ошибка в вашей программе.
Это не шутка.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Visual C (DevStudio), утечка памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]