Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 1618
∙ повысить рейтинг »
_Ayl_
Статус: Студент
Рейтинг: 1418
∙ повысить рейтинг »
Micren
Статус: Профессионал
Рейтинг: 1410
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / C/C++

Номер выпуска:1466
Дата выхода:05.01.2010, 01:30
Администратор рассылки:Dr_Andrew, Старший модератор
Подписчиков / экспертов:678 / 185
Вопросов / ответов:1 / 1
IRC-канал по теме:#C

Вопрос № 175733: Здравствуйте, эксперты. Что не правильно в моем коде? Программу может хранить массив из произвольного числа объектов класса. Но при попытке записать данные в класс, программа вылетает. Оператор new - НЕ подходит, т. к. количе...



Вопрос № 175733:

Здравствуйте, эксперты.

Что не правильно в моем коде?

Программу может хранить массив из произвольного числа объектов класса.
Но при попытке записать данные в класс, программа вылетает.

Оператор new - НЕ подходит, т. к. количество объектов массива может быть изменено в любой момент, и следовательно, память будет постоянно "перевысвобождаться".

Отправлен: 30.12.2009, 03:01
Вопрос задал: Иванов Андрей Владимирович, 5-й класс
Всего ответов: 1
Страница вопроса »


Отвечает Сандров Алекс, Студент :
Здравствуйте, Иванов Андрей Владимирович.

Тут сразу есть одна большая ошибка с самостоятельными alloc-ами: если в структуре есть переменные классов с конструкторами, то вызова этих конструкторов не будет! Для того и нужен new, он, кроме того что память выделяет, он делает правильную инициализацию. Он запустит конструктор класса, а конструктор запустит конструкторы своих переменных, и так далее.

Это видно, если посмотреть под дебагом состояние users после первого realloc: у строчном указателе мусор: 0xcdcdcdcd, и при обращении в SetName, класс string воспримет это, как валидную строчку и начнёт копирование по битому адресу.

Если нужно постоянно перевыделять память, даже таким странным образом, оператор new тоже подходит, достаточно просто завести пару указателей, по одному хранить данные, по второму выделять новое пространство, потом через memcpy перегонять одно в другое (опять же, аккуратней с указателями!), realloc делает тоже самое, только "тупо" выделяя кусок памяти без какой-либо инициализации. Alloc-ами надо пользоваться только на примитивных стуктурах данных, не требующих инициализации и только в случае, если требуется скорость (в играх, например).

В приложении привёл работающий код с закомментированными старыми строками. Использую вектор для хранения данных. Вектор позволяет резервировать память под данные (функция reserve) что избавить от постоянного её выделения. А так же есть параметро (не помню) который отвечает за то, сколько памяти будет выделено за раз, когда память в векторе кончится(что-то я его в векторе не нашёл, но он точно был). Кроме того вектор даёт возможность простого доступа к данным через итераторы, или через оператор массива []. И не надо греть голову про память контейнера(только про память самих элементов).

Приложение:

Ответ отправил: Сандров Алекс, Студент
Ответ отправлен: 30.12.2009, 07:43

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 258256 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.13 от 28.12.2009

    В избранное