Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Проблема с выделением памяти (https://forum.antichat.xyz/showthread.php?t=86652)

_nic 28.09.2008 19:57

Проблема с выделением памяти
 
Допустим есть одна программа написанная на С++ Builder из BDS2006.По сути там одна форма и с одной кнопкой.Кнопка вызывает ф-цию обьявленную примерно так char *function(void) .Внутри этой ф-ции в куче через оператор new выделяются 3 переменные ,каждая по килобайту.Ну и после return делается delete для каждой переменной.Проблема в том что после каждого нажатия кнопки.Обьем памяти который занимает програма растет на 4 килобайта :( Можно как то с этой утечкой расправится?

_nic 28.09.2008 20:34

Цитата:

Сообщение от Larionich
Хм. Давно пользовался операторами new(), delete(), но помню что даже в книге "с++ для чайников" написано, что это частая ошибка, переменные локальные, delete() нужно вызывать внутри функции.
Попробуй вызвать delete(), а потом return.

А как быть с переменной которая возвращается в качестве результата ф-ции?

procedure 28.09.2008 20:47

ТС ты удаляешь сылку или переменную?

_nic 28.09.2008 20:50

Цитата:

Сообщение от procedure
ТС ты удаляешь сылку или переменную?

Если я пробую удалить ссылку то вообще при первом же нажатии кнопки вылазит Access Violation

M@X Dr.Akyla 28.09.2008 20:59

Может лучьше использовать переменны? они после выхода из функции удаляются.
Код после return; не выполняется!
Попробуй создать деструктор и в нем удалить ссылки.

ps месяц без С++ и все забыл.

_nic 28.09.2008 21:17

Цитата:

Сообщение от M@X Dr.Akyla
Может лучьше использовать переменны?

Нипонял.Какие такие переменные?Если стековые,то я в стековой памяти нехочу слишком много хранить данных.Одно дело если буфер в несколько килобайт.Другое если в несколько мегабайт.Стека нехватит.А в куче память всеравно почему то будет течь :(

_nic 28.09.2008 21:40

Цитата:

Сообщение от M@X Dr.Akyla
_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 килобайта.А я почему то думал что после завершение работы ф-ции все её внутренние переменные полностью вычищяются из памяти.


Время: 15:09