Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Virtual Memory leak

92
14 января 2009 года
Тень Пса
2.2K / / 19.10.2006
Привет!

С такой проблемой столкнулся... может где-то был невнимателен.

Дело вот в чем: пишу uploader, задача посылать большие файлы. Есть 2 простеньких класса - TBinFile и THTTP (который пользует сокеты, не wininet, чтобы засылать файлы по http 5 метров кусок.). И вот при чтении из файла 5 метров данных, вижу как растет использование RAM на 5 метров, потом ессна эти 5 метров освобождаются, т.к. делается delete для буффера, НО! virtual memory загаживается ровно по 5 метров и не осовобождается пока не завершит свою работу программа.

код:
Код:
/*
открывается файл так:
this->fd = CreateFile(fileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY & FILE_FLAG_OVERLAPPED, NULL);
*/

unsigned char * TBinFile::ReadBlock(__int64 * red, long n)
{
 unsigned long really_red = 0;
 if (this->fd != NULL) {
   if (this->pos >= this->Size()) {
    (*red) = -1;
    this->Seek(0);
    return NULL;
   }
   unsigned char * data = new unsigned char[n];
   __int64 remain = this->size - this->pos;
   if (remain >= n) {
    ReadFile(this->fd, data, n, &really_red, &seek_st);
   } else {
    ReadFile(this->fd, data, remain, &really_red, &seek_st);
   }
   (*red) = really_red;
   this->pos += (*red);
   if ((*red) == 0) {
    this->Seek(0);
   }
   return data;
 }
 return NULL;
}

bool TBinFile::Seek(__int64 pos1)
{
 if (this->fd != NULL && pos1 <= this->Size()) {
    this->seek_st.Offset = pos1;
    this->seek_st.hEvent = NULL;
 } else {
    this->seek_st.Offset = 0;
    this->seek_st.hEvent = NULL;
    return false;
 }
 return true;
}

//////

toUploadBytes = this->files[file]->Size();
this->chunk_size = 1024*1024*2;
data2 = new unsigned char[chunk_size];
data2 = this->files[file]->ReadBlock(&block_size, chunk_size); // чтение из файла
if (block_size < 1) {
 (*red) = 0;
 return "";
} else {
 (*red) = block_size;
}


// дальше посыл через сокет.
куда девается по 5 метров.... бьюсь уже хз сколько времени.
535
15 января 2009 года
Нездешний
537 / / 17.01.2008
Код:
//////

toUploadBytes = this->files[file]->Size();
this->chunk_size = 1024*1024*2;
[COLOR="Red"]data2 = new unsigned char[chunk_size];//выделил первый блок памяти[/COLOR]
[COLOR="#ff0000"]data2 =[/COLOR] this->files[file]->ReadBlock(&block_size, chunk_size); // [COLOR="#ff0000"]теперь в указателе data2 адрес второго блока памяти - адрес первого блока потерял[/COLOR]
if (block_size < 1) {
 (*red) = 0;
 return "";
} else {
 (*red) = block_size;
}
...
unsigned char * TBinFile::ReadBlock(__int64 * red, long n)
{
 unsigned long really_red = 0;
 if (this->fd != NULL) {
   if (this->pos >= this->Size()) {
    (*red) = -1;
    this->Seek(0);
    return NULL;
   }
   [COLOR="#ff0000"]unsigned char * data = new unsigned char[n];//выделил второй блок памяти[/COLOR]
   __int64 remain = this->size - this->pos;
   if (remain >= n) {
    ReadFile(this->fd, data, n, &really_red, &seek_st);
   } else {
    ReadFile(this->fd, data, remain, &really_red, &seek_st);
   }
   (*red) = really_red;
   this->pos += (*red);
   if ((*red) == 0) {
    this->Seek(0);
   }
   return data;
 }
 return NULL;
}

PS где, кстати, по 5 метров? Вижу только по 2: this->chunk_size = 1024*1024*2;
92
15 января 2009 года
Тень Пса
2.2K / / 19.10.2006
про 2 метра: эт я проверял, в этом ли месте жрёт )))) оказалось в этом ;)
про остальное =) ну блин.... огромное спасибо! :))))

PS: вроде не маленький уже... а такие ошибки всё равно допускаю.. стыдно, товарищи! :(
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог