Просмотр полной версии : Проблема с выделением памяти
Допустим есть одна программа написанная на С++ Builder из BDS2006.По сути там одна форма и с одной кнопкой.Кнопка вызывает ф-цию обьявленную примерно так char *function(void) .Внутри этой ф-ции в куче через оператор new выделяются 3 переменные ,каждая по килобайту.Ну и после return делается delete для каждой переменной.Проблема в том что после каждого нажатия кнопки.Обьем памяти который занимает програма растет на 4 килобайта :( Можно как то с этой утечкой расправится?
Хм. Давно пользовался операторами new(), delete(), но помню что даже в книге "с++ для чайников" написано, что это частая ошибка, переменные локальные, delete() нужно вызывать внутри функции.
Попробуй вызвать delete(), а потом return.
А как быть с переменной которая возвращается в качестве результата ф-ции?
procedure
28.09.2008, 20:47
ТС ты удаляешь сылку или переменную?
ТС ты удаляешь сылку или переменную?
Если я пробую удалить ссылку то вообще при первом же нажатии кнопки вылазит Access Violation
M@X Dr.Akyla
28.09.2008, 20:59
Может лучьше использовать переменны? они после выхода из функции удаляются.
Код после return; не выполняется!
Попробуй создать деструктор и в нем удалить ссылки.
ps месяц без С++ и все забыл.
Может лучьше использовать переменны? Нипонял.Какие такие переменные?Если стековые,то я в стековой памяти нехочу слишком много хранить данных.Одно дело если буфер в несколько килобайт.Другое если в несколько мегабайт.Стека нехватит.А в куче память всеравно почему то будет течь :(
_nic можешь исходник выложить?
char* lsds()
{
char buff[1024];
char *buf=new char[1024];
char *buf1=new char[1024];
char *buf2=new char[1024];memset(buf2,NULL,1024);
struct {
UINT type;
LPCSTR name;
} DTF [] = {
{ DRIVE_UNKNOWN, " Unknown\n" },
{ DRIVE_NO_ROOT_DIR, " Invalid path\n" },
{ DRIVE_REMOVABLE, " Removable\n" },
{ DRIVE_FIXED, " Fixed\n" },
{ DRIVE_REMOTE, " Network drive\n" },
{ DRIVE_CDROM, " CD-ROM\n" },
{ DRIVE_RAMDISK, " RAM disk\n" },
{ 0, NULL},
};
GetLogicalDriveStrings(sizeof(buff)/sizeof(char),buff);
for(int i=0; i<1024-1; i++)
if( buff[i]==0)
{
if(buff[i+1] != 0)
buff[i] =(char) 0x20;
else
break;
}strcpy(buf,buff);
for(;;)
{
strncpy(buf1,buf,3);buf+=4;
strcat(buf2,buf1);strcat(buf2,DTF[GetDriveType(buf1)].name);
if(strlen(buf)==0){break;}
}
return(buf2);
}
В кнопке
ShowMessage(lsds());
С каждым нажатием на которую.Количество памяти занимаемое прогой увеличивается на 4 килобайта.А я почему то думал что после завершение работы ф-ции все её внутренние переменные полностью вычищяются из памяти.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot