Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

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

Немного про std::string - C++
Привет, читал про std::string на разных сайтах. 1. Там говорят, С++ 11 гарантирует, что std::string будет stored contiguously in...

Файловый поток и std::string - C++
добрый день сейчас меня немножко ввело в тупняк - из файлового потока(ifstream) нельзя прочитать по словам типа std::string? только char*...

как проинициализировать std::stack<const int> obj ( std::stack<int>{} ); - C++
добрый день. вопрос в коде: http://rextester.com/VCVVML6656 #include &lt;iostream&gt; #include &lt;stack&gt; //-std=c++14...

std::filesystem && std::asio и пр - C++
Пытался найти хоть какие-то сроки включения всего этого в стандарт (так же ожидается lexical_cast, any, string_algo и т.д.) и вообщем везде...

Ошибка "неопределенная ссылка" при работе с std::thread - C++
При попытке сделать что-либо с std::thread, выдает ошибку компиляции, &quot;неопределенная ссылка &quot; . К примеру: #include...

std::defaultfloat - C++
Есть такая тема в новом стандарте как std::defaultfloat Описание: http://www.cplusplus.com/reference/ios/defaultfloat/ В стандарте...

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

оформи вопрос. коротко. ясно. остальное - удали.
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
15.02.2010, 21:45  [ТС] #3
2 zim22 Прошу прощения, просто все ошибки появились одновременно и их объединяет подобные ругательства:
HEAP[WFAE.exe]: HEAP: Free Heap block e68be0 modified at e68ec0 after it was freed
Вылетает то в создании std::fstream, то в операциях с std::string... а теперь словил и в new в своем же классе. Впервые с таким столкнулся, несколько дней безрезультатно отлаживаю а толку никакого.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 21:50 #4
Цитата Сообщение от insideone Посмотреть сообщение
У меня ощущение что я скушал всю память
ты бы об этом узнал. функция operator new кидает exception bad_alloc, если память не удалось выделить
http://www.cplusplus.com/reference/std/new/bad_alloc/
1
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
15.02.2010, 21:57  [ТС] #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]; ... Получается память не при чем? Какая то магическая ошибка
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 21:58 #6
Цитата Сообщение от insideone Посмотреть сообщение
_data
какой тип?
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
15.02.2010, 21:59  [ТС] #7
C++
1
2
3
4
5
6
class qString{
private:
    char* _data;
    size_t _size;
/* etc */
}
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 22:02 #8
insideone, можешь воспроизвести ошибку, написав другой, маленький тестовый код?
т.е. чтобы я тоже мог у себя посмотреть
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
15.02.2010, 22:09  [ТС] #9
В том то и вся проблема что проблема одинакового характера появляется в разных объектах, изначально нашёл в fstream, потом исправил глупую ошибку, однако тоже самое начало вылетать при операциях в std::string. Я решил заменить конкретное место где был std::string на свой класс где я хотя бы понимаю что где происходит. И тут ошибка повторяется на операции new... Я конечно понимаю что мой класс может быть кривым и т.д. но я с ним уже изрядно поработал и сбоев он не давал.
Сейчас... написал банально в функции
C++
1
char* abc = new char[50];
И вылетела чудо ошибка а можно как нибудь словить ошибку тип которой не знаешь?
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 22:11 #10
Цитата Сообщение от insideone Посмотреть сообщение
а можно как нибудь словить ошибку тип которой не знаешь?
catch(...) { }
0
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
15.02.2010, 22:11 #11
По симптомам очень похоже на расстрел памяти - возможно, через какой-то неинициализированный указатель.
Попробуй привести минимальный код, который уверенно позволяет воспроизвести ошибку.
1
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
15.02.2010, 22:15  [ТС] #12
C++
1
2
3
4
5
6
try{
    char* abc = new char[50];
}
catch(...){
    int a = 0; a++;
}
Ошибка есть, catch'a нет...

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

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

ps. Может слово "проект" вводит вас в заблуждение о том что я какой то серьезный разработчик, однако это моя первая программа (на C++), а именно игра, я не очень хорошо наверное организовал код что он стал немного неповоротлив, но сейчас переписывать столько заново уже невозможным кажется...
0
15.02.2010, 22:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2010, 22:48
Привет! Вот еще темы с ответами:

Вопрос по std::map - C++
В качестве хэш-таблицы для строк (AnsiString) я использовал std::map. От таблицы мне нужно было ещё и такое свойство: я хотел иметь...

переписать std::map - C++
Добрый вечер! Есть работающая программа, в которой используется map, все работало хорошо, но теперь немного изменились условия и объем...

Создание объекта std::set - C++
http://www.cplusplus.com/reference/stl/set/set/ Вот официальный сайт, по-моему. И вот там такие конструкторы: explicit set ( const...

Std::function<>::target() возвращает 0 - C++
Привет! Не удовольствия для, а фриланса ради пришлось работать с WinAPI. Всем известно, что это чистый С. Так вот захотел я привязать...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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