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

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 28 Sep 2008.

  1. _nic

    _nic Elder - Старейшина

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

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    А как быть с переменной которая возвращается в качестве результата ф-ции?
     
  3. procedure

    procedure Elder - Старейшина

    Joined:
    22 Dec 2007
    Messages:
    527
    Likes Received:
    257
    Reputations:
    46
    ТС ты удаляешь сылку или переменную?
     
    1 person likes this.
  4. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Если я пробую удалить ссылку то вообще при первом же нажатии кнопки вылазит Access Violation
     
  5. M@X Dr.Akyla

    M@X Dr.Akyla Elder - Старейшина

    Joined:
    9 Apr 2008
    Messages:
    72
    Likes Received:
    44
    Reputations:
    0
    Может лучьше использовать переменны? они после выхода из функции удаляются.
    Код после return; не выполняется!
    Попробуй создать деструктор и в нем удалить ссылки.

    ps месяц без С++ и все забыл.
     
    #5 M@X Dr.Akyla, 28 Sep 2008
    Last edited: 28 Sep 2008
  6. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Нипонял.Какие такие переменные?Если стековые,то я в стековой памяти нехочу слишком много хранить данных.Одно дело если буфер в несколько килобайт.Другое если в несколько мегабайт.Стека нехватит.А в куче память всеравно почему то будет течь :(
     
  7. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Code:
    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);
    }
    
    В кнопке
    Code:
    ShowMessage(lsds());
    
    С каждым нажатием на которую.Количество памяти занимаемое прогой увеличивается на 4 килобайта.А я почему то думал что после завершение работы ф-ции все её внутренние переменные полностью вычищяются из памяти.