Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.76
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
#1

std::string, std::fstream, ошибка кучи - C++

15.02.2010, 21:40. Просмотров 3061. Ответов 18
Метки нет (Все метки)

HEAP[WFAE.exe]: HEAP: Free Heap block e68be0 modified at e68ec0 after it was freed
где то начало вылетать при операции += с локальной переменной std::string. Заменил на свой qString. Замечательно, то же самое... ошибка при
C++
1
_data = new char[_size]; // _size == 12
У меня ощущение что я скушал всю память, однако диспечер задач говорит об обратном. Приложение кушает 80 мб памяти, что не сильно больше чем обычно... я прямо не знаю что делать. Почему может такое происходить?

Промелькнула мысль про то что стек начал переполняться... но тут же new... да и тот же std::string думаю сам память выделяет
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 21:42     std::string, std::fstream, ошибка кучи #2
insideone, я не понимаю, чего ты хочешь.
ты не перепутал дневник личных записей с форумом?

оформи вопрос. коротко. ясно. остальное - удали.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
15.02.2010, 21:45  [ТС]     std::string, std::fstream, ошибка кучи #3
2 zim22 Прошу прощения, просто все ошибки появились одновременно и их объединяет подобные ругательства:
HEAP[WFAE.exe]: HEAP: Free Heap block e68be0 modified at e68ec0 after it was freed
Вылетает то в создании std::fstream, то в операциях с std::string... а теперь словил и в new в своем же классе. Впервые с таким столкнулся, несколько дней безрезультатно отлаживаю а толку никакого.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 21:50     std::string, std::fstream, ошибка кучи #4
Цитата Сообщение от insideone Посмотреть сообщение
У меня ощущение что я скушал всю память
ты бы об этом узнал. функция operator new кидает exception bad_alloc, если память не удалось выделить
http://www.cplusplus.com/reference/std/new/bad_alloc/
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
15.02.2010, 21:57  [ТС]     std::string, std::fstream, ошибка кучи #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// РАБОТА С ПАМЯТЬЮ
void qString::_new (const char* newData){
    if ( newData != NULL )
    {
        // Выделение памяти под полученную строку
        _size = strlen(newData) + 1;
        try{
            _data = new char[_size];
        }
        catch (std::bad_alloc& ba){
            int a = 0; a++;
        }
        strcpy_s(_data, _size, newData);
    }
    else
    {
        // Минимальная строка
        _size = 1;
        _data = new char[_size];
        _data[0] = '\0';
    }
}
К сожалению впервые использую try - catch, может что не так сделал. Поставил в catch точку останова, не сработала, ошибка та же про кучу вылетает сразу после _data = new char[_size]; ... Получается память не при чем? Какая то магическая ошибка
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 21:58     std::string, std::fstream, ошибка кучи #6
Цитата Сообщение от insideone Посмотреть сообщение
_data
какой тип?
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
15.02.2010, 21:59  [ТС]     std::string, std::fstream, ошибка кучи #7
C++
1
2
3
4
5
6
class qString{
private:
    char* _data;
    size_t _size;
/* etc */
}
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 22:02     std::string, std::fstream, ошибка кучи #8
insideone, можешь воспроизвести ошибку, написав другой, маленький тестовый код?
т.е. чтобы я тоже мог у себя посмотреть
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
15.02.2010, 22:09  [ТС]     std::string, std::fstream, ошибка кучи #9
В том то и вся проблема что проблема одинакового характера появляется в разных объектах, изначально нашёл в fstream, потом исправил глупую ошибку, однако тоже самое начало вылетать при операциях в std::string. Я решил заменить конкретное место где был std::string на свой класс где я хотя бы понимаю что где происходит. И тут ошибка повторяется на операции new... Я конечно понимаю что мой класс может быть кривым и т.д. но я с ним уже изрядно поработал и сбоев он не давал.
Сейчас... написал банально в функции
C++
1
char* abc = new char[50];
И вылетела чудо ошибка а можно как нибудь словить ошибку тип которой не знаешь?
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 22:11     std::string, std::fstream, ошибка кучи #10
Цитата Сообщение от insideone Посмотреть сообщение
а можно как нибудь словить ошибку тип которой не знаешь?
catch(...) { }
CheshireCat
Эксперт С++
2910 / 1238 / 78
Регистрация: 27.05.2008
Сообщений: 3,321
15.02.2010, 22:11     std::string, std::fstream, ошибка кучи #11
По симптомам очень похоже на расстрел памяти - возможно, через какой-то неинициализированный указатель.
Попробуй привести минимальный код, который уверенно позволяет воспроизвести ошибку.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
15.02.2010, 22:15  [ТС]     std::string, std::fstream, ошибка кучи #12
C++
1
2
3
4
5
6
try{
    char* abc = new char[50];
}
catch(...){
    int a = 0; a++;
}
Ошибка есть, catch'a нет...

Забыл добавить... после этой ошибки эта функция вызывается ещё много раз (ф-я загрузки файлов) в цикле. Так вот после этой ошибки в тех же строках дальше ошибка эта ни разу не возникает. Программа запускается и работает как надо, но все же это помоему критическая ошибка и не хотелось бы оставлять это на произвол судьбы

По симптомам очень похоже на расстрел памяти - возможно, через какой-то неинициализированный указатель.
Попробуй привести минимальный код, который уверенно позволяет воспроизвести ошибку.
Т.е. мне надо искать где то (NULL)->... ? или не NULL а как там бывает в локальных... мусор, вроде fefefefe.
Просто проект громадина, и ошибка возникать стала там где всегда все работало отлично. Такое ощущение что гораздо ранее этого что то я натворил. Теперь попробую поискать в этом ракурсе
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 22:20     std::string, std::fstream, ошибка кучи #13
insideone, проанализируй свою исходник умными прогами, типа valgrind или BoundsChecker
CheshireCat
Эксперт С++
2910 / 1238 / 78
Регистрация: 27.05.2008
Сообщений: 3,321
15.02.2010, 22:37     std::string, std::fstream, ошибка кучи #14
Цитата Сообщение от insideone Посмотреть сообщение
Просто проект громадина, и ошибка возникать стала там где всегда все работало отлично. Такое ощущение что гораздо ранее этого что то я натворил. Теперь попробую поискать в этом ракурсе
Эммм..... VCS какая? Просто откати на версию, "где всегда все работало отлично", и начинай diff'ом смотреть различия.....
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
15.02.2010, 22:48  [ТС]     std::string, std::fstream, ошибка кучи #15
Цитата Сообщение от CheshireCat Посмотреть сообщение
Эммм..... VCS какая? Просто откати на версию, "где всегда все работало отлично", и начинай diff'ом смотреть различия.....
VCS? К сожалению слышу впервые, хотя конечно немного просвятился сейчас в гугле. Да было бы полезно. На самом деле я храню некоторые "контрольные" архивы с кодом. Можно конечно возвратиться, но... не хотелось бы допустить такое сново, а когда не знаешь что произошло может повториться.

ps. Может слово "проект" вводит вас в заблуждение о том что я какой то серьезный разработчик, однако это моя первая программа (на C++), а именно игра, я не очень хорошо наверное организовал код что он стал немного неповоротлив, но сейчас переписывать столько заново уже невозможным кажется...
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 22:53     std::string, std::fstream, ошибка кучи #16
Цитата Сообщение от insideone Посмотреть сообщение
VCS? К сожалению слышу впервые,
это же отлично. после такой неприятности - ты обязательно её себе поставишь
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
15.02.2010, 23:00  [ТС]     std::string, std::fstream, ошибка кучи #17
И вправду, везде можно найти положительные стороны Осталось только найти где закралась ошибка. И ведь наверняка какая нибудь глупейшая.
CheshireCat
Эксперт С++
2910 / 1238 / 78
Регистрация: 27.05.2008
Сообщений: 3,321
15.02.2010, 23:13     std::string, std::fstream, ошибка кучи #18
Дык, эта..... Есть такая замечательная утилита - KDiff (гуглится). Сравниваешь файлы последней версии, в которой "все работает", с текущими. На 90% ошибка именно во внесенных изменениях.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2010, 01:32     std::string, std::fstream, ошибка кучи
Еще ссылки по теме:

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc C++
Ошибка Cannot convert std::string to void* C++
Ошибка в std::cout<<std::endl C++
C++ Builder Ошибка: E2034 Cannot convert 'int' to 'std::vector<std::vector<TRabbitCell,std::allocator<TRabbitCell>>...
C++ Ошибка "non-static data member initializers only available with -std=c++11 or -std=gnu++11"

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
16.02.2010, 01:32  [ТС]     std::string, std::fstream, ошибка кучи #19
Проблема была решена, однако я так и не понял из за чего она возникла. Сейчас я просто сел и переписал последнюю свою разработку - систему частиц. Там я попытался использовать принцип уменьшения зависимостей когда класс содержит лишь указатели и в .h нет include никаких... видимо это действительно приводило к каким то проблемам. В действительности я нашёл пару ошибок где из локального объекта копировалось значение указателя а не делалась копия в объект. Фактически же я не понял в чем проблема, возможно она была и не в этом (было бы плохо). Но все это урок мне. Где классу нужны данные там не стоит писать указатель, указатель... вернее не знаю может и можно когда осторожно, запутался я при таком большом количестве связей.
И все же у меня имеются некоторые подозрения насчет правильности загрузки данных из файлов. С вашего позволения выложу код, кому не лень пробегитесь глазами, нет ли бреда? Загрузка файлов это моя нелюбимая тема к сожелению. Итак, код:
C++
1
2
3
4
5
// Проходим по всем файлам в папке data\\strings
// применяя к файлу алгоритм FileManager::String
// загружать только файлы с расширением "shm"
// pStrings - указатель приемника данных загружаемых из файла
FileManager::FromDir(FileManager::String, "data\\strings", pStrings, "shm", "\0");
FileManager::FromDir
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
bool FromDir(bool(*LoadAlgoritm)(const char* FilePath, void* Target), char* Path, void* Target, char* Exts, ...)
{
    WIN32_FIND_DATA FFD; 
    HANDLE hSearch = INVALID_HANDLE_VALUE; 
    
    std::string sPath, sFileName, sFullPath, sExt;
    sPath = Path; sPath += "\\*.*";
    unsigned short int Count = 0, Divider = 0;
 
    if ((hSearch = FindFirstFile(sPath.c_str(), &FFD)) == INVALID_HANDLE_VALUE) 
        return false; // в противном случае выходим
    sPath = Path; sPath += "\\";
    do
    {
        // Если нашли папку - следующий ход
        if ( FFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
            continue;
        sFileName = FFD.cFileName;
        sFullPath = sPath + sFileName;
        // Для определения окончания заведем разделитель
        Divider = sFileName.find_last_of('.');
        // Определяем окончание найденного файла
        sExt.assign(sFileName, Divider+1, sFileName.length()-Divider);
        bool CorrectExt = false; char** TempExts = &Exts;
        do {
            if ( sExt == *TempExts )
            {
                CorrectExt = true;
            break;
            }
            TempExts++;
        } while ( (*TempExts)[0] != NULL ); // если текущая строка пуста - конец
         // Если этот файл имеет некорректное разрешение ищем следующий
        if ( CorrectExt == false ) continue;
            // теперь в sFullPath есть полный путь к файлу
        // и цель записи, куда алгоритм запишет данные
        LoadAlgoritm(sFullPath.c_str(), Target);
    }
    while (FindNextFile(hSearch, &FFD)); // ищем следующий файл
    FindClose(hSearch); // заканчиваем поиск
return true;
}

FileManager::String
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// Загрузка строковых данных
bool String(const char* FileName, void* Target)
{
    StringGroup* Temp = (StringGroup*)Target;
    StringGroup& Strings = *Temp; // работаем с приемником данных
    // Открываем файл
    std::fstream CurFile(FileName, std::ios::in);
    // Переменные для считываемых из файла значений
    std::string CURLINE, KEYWORD;
    while ( CurFile.eof() == false )
    {
        // Читаем строку из файла
        std::getline(CurFile, CURLINE);
        // Вырезаем все до первой табуляции\пробела\запятой - получаем ключевое слово
        SW::CutBefore(KEYWORD, CURLINE, "\t ,");
            int Cur22 = CURLINE.find(0x22);
        // Обе кавычки найдены
        if ( CURLINE.find(0x22, Cur22+1) != 0xffffffff )
        {
            // В строке CURLINE оставить только то что находится между первыми двумя '"' (0x22 HEX)
            SW::CutBetween(&CURLINE, 0x22);
        }
        else
        {
            SW::CutBefore(CURLINE, CURLINE, "\t ,\\/");
        }
            // Если строка пустая
        if ( KEYWORD == "" )
            continue;
        // Если комментарий
        if ( KEYWORD == "//" )
            continue;
        
        // загружаем строку CURLINE в репозиторий строк по индексом hash(KEYWORD)
        const char* Key = KEYWORD.c_str();
        size_t Size = CURLINE.length() + 1;
        memcpy(Strings.Write(Key, Size), CURLINE.c_str(), Size);
    }
    CurFile.close();        
return true;
}

Остальные ресурсы грузятся подобным образом, в цикле "while ( CurFile.eof() == false )" обрабатываются все строки файла и анализируются по ключевым словам. KEYWORD, CURLINE обычно служат в виде источника и лишь иногда изменяются. На SW::CutBetween и SW::CutBefore не обращайте внимания, это кривые но работоспособные функции... в принципе все. Боюсь я за загрузку файлов потому как разбирался в этом лишь поверхностно и как сделал сразу забыл. Т.к. ошибка появилась именно std::fstream лучше перестраховаться....
Yandex
Объявления
16.02.2010, 01:32     std::string, std::fstream, ошибка кучи
Ответ Создать тему
Опции темы

Текущее время: 01:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru