ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Проблема с выделением памяти
  #1  
Старый 28.09.2008, 19:57
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию Проблема с выделением памяти

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

  #2  
Старый 28.09.2008, 20:34
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

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

  #3  
Старый 28.09.2008, 20:47
procedure
Banned
Регистрация: 22.12.2007
Сообщений: 660
Провел на форуме:
3885269

Репутация: 1158


По умолчанию

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

  #4  
Старый 28.09.2008, 20:50
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

Цитата:
Сообщение от procedure  
ТС ты удаляешь сылку или переменную?
Если я пробую удалить ссылку то вообще при первом же нажатии кнопки вылазит Access Violation
 
Ответить с цитированием

  #5  
Старый 28.09.2008, 20:59
M@X Dr.Akyla
Участник форума
Регистрация: 09.04.2008
Сообщений: 111
Провел на форуме:
2471762

Репутация: 151
По умолчанию

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

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

Последний раз редактировалось M@X Dr.Akyla; 28.09.2008 в 21:14..
 
Ответить с цитированием

  #6  
Старый 28.09.2008, 21:17
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

Цитата:
Сообщение от M@X Dr.Akyla  
Может лучьше использовать переменны?
Нипонял.Какие такие переменные?Если стековые,то я в стековой памяти нехочу слишком много хранить данных.Одно дело если буфер в несколько килобайт.Другое если в несколько мегабайт.Стека нехватит.А в куче память всеравно почему то будет течь
 
Ответить с цитированием

  #7  
Старый 28.09.2008, 21:40
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Версия GeForce 9600 GT с 2 Гб памяти от MSI появилась в продаже xGOR Новости мира "железа" 0 31.05.2008 01:52
ПЕРЕВОД: Технические приемы эксплуатирования операционных систем Ios Дрэгги Чужие Статьи 1 01.05.2008 01:43
[c++] Проблема с алокацией данных памяти в многопоточномприложении razzzar С/С++, C#, Delphi, .NET, Asm 10 18.03.2008 19:00
ВАЖНАЯ ПРОБЛЕМА!!! Sn_key Уязвимости 13 08.06.2005 15:50



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ