Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Exception: Out of memory 
:(
    Опции темы
vdm
Дата 18.3.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



День добрый. Из диалогового окна вызываю функцию фото и передаю wchar_t * место куда будет копироваться фото. Если место не указываю кидает в default C:\\сгенерированое название.bmp - в таком случае функцию вызываю сколько угодно раз и проблем нет. Но когда указываю дорожку куда будет сохранена фото, постоянно при 7 разе вызова функции кидает exception: Out of memory. Что делаю нитак?

Код

long photo(void) {

 m_pControl->Pause();
 // get width and height
 long height, width;
 pBasicVideo->get_VideoHeight(&height);
 pBasicVideo->get_VideoWidth(&width);

 long bufSize;
 long *imgData;
 HRESULT hr;
 /*
 The second value is NULL to resolve required buffer size.
 The required buffer size will be returned in variable "bufSize".
 */
 hr = pBasicVideo->GetCurrentImage(&bufSize, NULL);
 if (FAILED(hr)) {
     return 1;
 }
 if (bufSize < 1) {
     return 1;
 }
 imgData = (long *)malloc(bufSize);

 // The data will be in DIB format
 pBasicVideo->GetCurrentImage(&bufSize, imgData);

 // save DIB file as Bitmap.
 // This sample saves image as bitmap to help
 // understanding the sample.
 HANDLE fh;
 BITMAPFILEHEADER bmphdr;
 BITMAPINFOHEADER bmpinfo;
 DWORD nWritten;

 memset(&bmphdr, 0, sizeof(bmphdr));
 memset(&bmpinfo, 0, sizeof(bmpinfo));

 bmphdr.bfType = ('M' << 8) | 'B';
 bmphdr.bfSize = sizeof(bmphdr) + sizeof(bmpinfo) + bufSize;
 bmphdr.bfOffBits = sizeof(bmphdr) + sizeof(bmpinfo);

 bmpinfo.biSize = sizeof(bmpinfo);
 bmpinfo.biWidth = width;
 bmpinfo.biHeight = height;
 bmpinfo.biPlanes = 1;
 bmpinfo.biBitCount = 32;
        time_t date; // Make a time_t object that'll hold the date
        time(&date); //  Set the date variable to the current date
        wchar_t buff[MAX_PATH];
        string string1 ="C:\\";        
        string string2(ctime(&date));
        int position = string2.find(" ");
        while (position != string::npos) {
            string2.replace(position,1,"_");
            position = string2.find(" ", position+1);
        }
        position = string2.find(":");
        while (position != string::npos) {
            string2.replace(position,1,"_");
            position = string2.find(":", position+1);
        }
        string2.erase((string2.size()-1));
        
        zcntr = zcntr + 1;
        itoa(zcntr,str3,10);
        strcpy(str1, string1.c_str());
        strcpy(str2, string2.c_str());
        if (wcsNewStr == NULL) {
        strcat(str1,str2);
        strcat(str1,str3);
        strcat(str1,".bmp");
        mbstowcs(buff, str1, sizeof(str1));
        }
        else {
        strcat(str2,str3);
        strcat(str2,".bmp");
        mbstowcs(buff, str2, sizeof(str2));
            }
        wchar_t *wszNewStr1 = new wchar_t[(sizeof(wcsNewStr)+sizeof(buff))/sizeof(wchar_t)+1];
        if (wcsNewStr == NULL) {
            wcscpy(wszNewStr1, buff);
        }
        else {
        wchar_t *wcsNewStr1 = new wchar_t[(sizeof(wcsNewStr)+1)];
        wcscpy(wcsNewStr1, wcsNewStr);
        wcscpy(wszNewStr1, wcscat(wcsNewStr1, _T("\\")));
        wcscpy(wszNewStr1, wcscat(wcsNewStr1, buff));
        wcsNewStr1 = NULL;
        //delete wcsNewStr1;
        }

 fh = CreateFile(wszNewStr1,
     GENERIC_WRITE, 0, NULL,
     CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 WriteFile(fh, &bmphdr, sizeof(bmphdr), &nWritten, NULL);
 WriteFile(fh, &bmpinfo, sizeof(bmpinfo), &nWritten, NULL);
 WriteFile(fh, imgData, bufSize, &nWritten, NULL);
 CloseHandle(fh);
 delete wszNewStr1;
 free(imgData);

 // Release resource
 m_pControl->Run();
 return 0;
}

PM MAIL   Вверх
Lazin
Дата 18.3.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



Цитата(vdm @  18.3.2008,  11:11 Найти цитируемый пост)
Что делаю нитак?

не освобождаешь память, когда ее не остается оператор new кидает исключение
PM MAIL Skype GTalk   Вверх
Earnest
Дата 18.3.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Много кода привел; ты бы указал, где конкретно вылетает исключение.
А из общих соображений - проверь, достаточно ли памяти в буфере имени файла.


--------------------
...
PM   Вверх
vdm
Дата 18.3.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Цитата(Lazin @ 18.3.2008,  11:53)
Цитата(vdm @  18.3.2008,  11:11 Найти цитируемый пост)
Что делаю нитак?

не освобождаешь память, когда ее не остается оператор new кидает исключение

Но ведь я делаю delete переменным после использевания, или нужна освобождать по другому?
PM MAIL   Вверх
korian
Дата 18.3.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



не понимаю этой конструкции:
Код

        wchar_t *wszNewStr1 = new wchar_t[(sizeof(wcsNewStr)+sizeof(buff))/sizeof(wchar_t)+1];
        if (wcsNewStr == NULL) {
            wcscpy(wszNewStr1, buff);
        }
        else {
        wchar_t *wcsNewStr1 = new wchar_t[(sizeof(wcsNewStr)+1)];
        wcscpy(wcsNewStr1, wcsNewStr);
        wcscpy(wszNewStr1, wcscat(wcsNewStr1, _T("\\")));
        wcscpy(wszNewStr1, wcscat(wcsNewStr1, buff));
        wcsNewStr1 = NULL;
        //delete wcsNewStr1;
        }


фиг че пойму, delete закоменчено... почему? уже утечка...
переменные названы конечно... фиг поймешь где глабальная, где локальная. и еще интересно знать типы этих переменных.
и для оператора new [], надо вызывать delete []. для простых типов это не скажется, но для классов существенно.
delete [] wszNewStr1;

PM   Вверх
vdm
Дата 18.3.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Цитата(korian @ 18.3.2008,  13:28)
не понимаю этой конструкции:
Код

        wchar_t *wszNewStr1 = new wchar_t[(sizeof(wcsNewStr)+sizeof(buff))/sizeof(wchar_t)+1];
        if (wcsNewStr == NULL) {
            wcscpy(wszNewStr1, buff);
        }
        else {
        wchar_t *wcsNewStr1 = new wchar_t[(sizeof(wcsNewStr)+1)];
        wcscpy(wcsNewStr1, wcsNewStr);
        wcscpy(wszNewStr1, wcscat(wcsNewStr1, _T("\\")));
        wcscpy(wszNewStr1, wcscat(wcsNewStr1, buff));
        wcsNewStr1 = NULL;
        //delete wcsNewStr1;
        }


фиг че пойму, delete закоменчено... почему? уже утечка...
переменные названы конечно... фиг поймешь где глабальная, где локальная. и еще интересно знать типы этих переменных.
и для оператора new [], надо вызывать delete []. для простых типов это не скажется, но для классов существенно.
delete [] wszNewStr1;

тип переменных wchar_t * 
глобальные переменные здесь отсутствуют. Если закрываю как delete [] wszNewStr1; эфект тот-же... на 5 - 7 раз хетдл ловит. Моя идея такава: получаю через функцию из диалогового окна дорогу сохранения генерирую название будущего файла - его имя будет дата, соединяю дорожку с названием файла и сохраняю. Может у вас есть идеи как сделать это просче?
PM MAIL   Вверх
vdm
Дата 18.3.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



HEAP: Free Heap block 2a93048 modified at 2a93058 after it was freed
Unhandled exception at 0x7c901230 in st.exe: User breakpoint.

Вот что пишет дебугер, может кому яснее? Мне не очень... smile
PM MAIL   Вверх
korian
Дата 18.3.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



дебугер пишет, что данные по адресу ... были изменены после того как были удалены.
у вас в коде шо-то типа
Код

int* a = new int;
delete a;
*a = 0;


Добавлено @ 15:56
Цитата(vdm @  18.3.2008,  14:11 Найти цитируемый пост)
глобальные переменные здесь отсутствуют

а это что?
Цитата

zcntr
str3
str1
str2
wcsNewStr

и не проще ли использовать CString / CStringW / std::string вместо всех этих не понятных конструкций?

Это сообщение отредактировал(а) korian - 18.3.2008, 15:57
PM   Вверх
vinter
Дата 18.3.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



Цитата(korian @  18.3.2008,  14:28 Найти цитируемый пост)
для простых типов это не скажется

скажется, поведение неопределено в такой ситуации


--------------------
Мой блог
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0835 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.