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

C++

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

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

15.02.2010, 21:40. Просмотров 3098. Ответов 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 думаю сам память выделяет
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2010, 21:40     std::string, std::fstream, ошибка кучи
Посмотрите здесь:

Ошибка Cannot convert std::string to void* - C++
Не могу сконвертировать строку в void*: std::string str; (void*)str; Вернее invalid cast from type std::string to type void* ...

Std::map <string, class> ОШИБКА C2512 - C++
Есть следующий код: #include &lt;vector&gt; #include &lt;map&gt; class Aluy { public: Aluy (int x, int y) { int z = x+y; ...

std::string - C++
Господа, подскажите где можно поглядеть методы string-a литературы никакой под рукой нет, а гуглить в лоб что-то результаттов не дает. ...

Std::string - C++
никак не пойму чем отличаются методы append и assign у std::string?

std:string - C++
1. Поддерживает ли этот класс сравнение целиком строк? Каков синтаксис сравнения строк? 2. Поддерживает ли этот класс конкатенацию? Каков...

std::string - C++
Здравствуйте! У меня есть std::vector&lt;std::string&gt; Подскажите пожалуйста как быстро и красиво можно перевести i-тый элемент вектора в...

int to std::string - C++
Не подскажите как перевести int в std::string

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

оформи вопрос. коротко. ясно. остальное - удали.
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
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
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
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
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
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 21:58     std::string, std::fstream, ошибка кучи #6
Цитата Сообщение от insideone Посмотреть сообщение
_data
какой тип?
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
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
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 22:02     std::string, std::fstream, ошибка кучи #8
insideone, можешь воспроизвести ошибку, написав другой, маленький тестовый код?
т.е. чтобы я тоже мог у себя посмотреть
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
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
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 22:11     std::string, std::fstream, ошибка кучи #10
Цитата Сообщение от insideone Посмотреть сообщение
а можно как нибудь словить ошибку тип которой не знаешь?
catch(...) { }
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
15.02.2010, 22:11     std::string, std::fstream, ошибка кучи #11
По симптомам очень похоже на расстрел памяти - возможно, через какой-то неинициализированный указатель.
Попробуй привести минимальный код, который уверенно позволяет воспроизвести ошибку.
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
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
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 22:20     std::string, std::fstream, ошибка кучи #13
insideone, проанализируй свою исходник умными прогами, типа valgrind или BoundsChecker
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
15.02.2010, 22:37     std::string, std::fstream, ошибка кучи #14
Цитата Сообщение от insideone Посмотреть сообщение
Просто проект громадина, и ошибка возникать стала там где всегда все работало отлично. Такое ощущение что гораздо ранее этого что то я натворил. Теперь попробую поискать в этом ракурсе
Эммм..... VCS какая? Просто откати на версию, "где всегда все работало отлично", и начинай diff'ом смотреть различия.....
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
15.02.2010, 22:48  [ТС]     std::string, std::fstream, ошибка кучи #15
Цитата Сообщение от CheshireCat Посмотреть сообщение
Эммм..... VCS какая? Просто откати на версию, "где всегда все работало отлично", и начинай diff'ом смотреть различия.....
VCS? К сожалению слышу впервые, хотя конечно немного просвятился сейчас в гугле. Да было бы полезно. На самом деле я храню некоторые "контрольные" архивы с кодом. Можно конечно возвратиться, но... не хотелось бы допустить такое сново, а когда не знаешь что произошло может повториться.

ps. Может слово "проект" вводит вас в заблуждение о том что я какой то серьезный разработчик, однако это моя первая программа (на C++), а именно игра, я не очень хорошо наверное организовал код что он стал немного неповоротлив, но сейчас переписывать столько заново уже невозможным кажется...
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 22:53     std::string, std::fstream, ошибка кучи #16
Цитата Сообщение от insideone Посмотреть сообщение
VCS? К сожалению слышу впервые,
это же отлично. после такой неприятности - ты обязательно её себе поставишь
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
15.02.2010, 23:00  [ТС]     std::string, std::fstream, ошибка кучи #17
И вправду, везде можно найти положительные стороны Осталось только найти где закралась ошибка. И ведь наверняка какая нибудь глупейшая.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
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, ошибка кучи
Еще ссылки по теме:

std::string S.size() - C++ Linux
Почему? #include &lt;iostream&gt; int main() { std::string FIO=&quot;Ковалёв Алексей Никифорович&quot;; ...

std::string Трим - C++
Как сделать трим (вырезание из начала\конца строки лишних символов таких как пробелы, табуляции...) в std::string? Я недавно нашёл у себя в...

std::string в char* - C++
Можно ли привести std::string к указателю на нуль-терминальную строку? Как?

std::string to SCtring - C++
После выполнения этого кода выводится не &quot;123&quot; а какие-то каракули как это исправить? string s = &quot;123&quot;; ...

Visual C++ 7.0 и std::string - Visual C++
вот... создал новый проект... народ подскажите проблема в моей голове или в visual-e? на gcc всё работает как положено. ...


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

Или воспользуйтесь поиском по форуму:
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
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, ошибка кучи
Ответ Создать тему
Опции темы

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