0 / 0 / 0
Регистрация: 04.12.2012
Сообщений: 13
|
||||||||||||||||
1 | ||||||||||||||||
Ошибка в работе с памятью07.05.2013, 19:15. Показов 799. Ответов 4
Метки нет (Все метки)
После использования программы и последующего выхода из нее возникает ошибка HEAP CORRUPTION DETECTED.
Хотелось бы узнать, в чем причина и как в данном случае правильно выделить и освободить память. Был бы очень признателен, если б кто-нибудь смог отработать программу и указать на допущенные ошибки, т.к. очень нужно чтобы программа работала гладко, без ошибок.
0
|
07.05.2013, 19:15 | |
Ответы с готовыми решениями:
4
Ошибка при работе с памятью Ошибка при работе с памятью Ошибка при работе с памятью Ошибка с памятью при работе с двумерными массивами. |
...
1906 / 1326 / 965
Регистрация: 12.02.2013
Сообщений: 2,171
|
|
07.05.2013, 19:55 | 2 |
Tim Berg, сразу вопрос к вам: по вашему мнению сколько выделится памяти в конструкторе под поле data? Я не знаю как MS компилятор ведёт себя, но gcc сразу ругнулся. Как я понимаю, это аналог new char[0] (т.е. тогда проще data(NULL)), но я могу и ошибаться. Но в любом случае, вы в методе Push спокойно и без всяких сомнений добавляете элементы: data[length++] = element. И теперь опять возвращаюсь к вопросу: так сколько вы выделили памяти под data?
0
|
0 / 0 / 0
Регистрация: 04.12.2012
Сообщений: 13
|
|
07.05.2013, 22:46 [ТС] | 3 |
Могу написать глупость, но, как мне кажется, такой прием приемлим, т.к. это динамический массив (или нет?) и я могу добавить столько элементов, сколько мне позже понадобится.
С++ уже плохо помню, надо вспоминать. На VS у меня компилируется, работает и ошибка вылетает только по окончании работы программы.
0
|
...
1906 / 1326 / 965
Регистрация: 12.02.2013
Сообщений: 2,171
|
|
08.05.2013, 04:19 | 4 |
Не обижайтесь, но вы написали глупость.
А что есть динамический массив? Вы объявляете char* data - это ничто иное как просто указатель на область памяти. Когда вы пишите, к примеру, data = new char[10] тем самым вы выделяете (резервируете) память размером sizeof(char) * 10 (т.е 10 байт) и адрес на начало этого вектора (выделенного участка памяти) присваиваете data. Контроль выхода за границы выделенной памяти никто кроме вас осуществлять не будет. Я не знаю сколько MS компилятор выделит памяти при такой записи new char[], но в любом случае это либо 0, либо 1. Эх, если бы всё было так просто! Ваши действия из разряда Undefined behavior. Если бы вы попробовали поработать с большим количеством символов, то ваша программа вылетела бы раньше.
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
08.05.2013, 09:53 | 5 |
MS генерит в таком случае код, эквивалентный new char[0]. Не очень понятно, почему они разрешают не писать число в скобках, ну, пусть это будет на их совести.
1
|
08.05.2013, 09:53 | |
08.05.2013, 09:53 | |
Помогаю со студенческими работами здесь
5
Ошибка в коде при работе с динамической памятью Ошибка с памятью при работе класса и map Ошибка с памятью при работе с динамическим двумерным массивом Управление динамической памятью при работе с классами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |