/*
открывается файл так:
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;
}
// дальше посыл через сокет.
Virtual Memory leak
С такой проблемой столкнулся... может где-то был невнимателен.
Дело вот в чем: пишу uploader, задача посылать большие файлы. Есть 2 простеньких класса - TBinFile и THTTP (который пользует сокеты, не wininet, чтобы засылать файлы по http 5 метров кусок.). И вот при чтении из файла 5 метров данных, вижу как растет использование RAM на 5 метров, потом ессна эти 5 метров освобождаются, т.к. делается delete для буффера, НО! virtual memory загаживается ровно по 5 метров и не осовобождается пока не завершит свою работу программа.
код:
Код:
Код:
//////
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;
}
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;
про остальное =) ну блин.... огромное спасибо! :))))
PS: вроде не маленький уже... а такие ошибки всё равно допускаю.. стыдно, товарищи! :(