![]() |
|
Модераторы: bsa |
![]()
|
|
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Если стандартный метод выделения памяти не подходит, то перегрузите оператор new для своего класса и выделяйте в нем память своим способом, при этом будет правильно работать инициализация объектов.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
Надо до этого дорасти)) Начать использовать new вместо malloc. Пойду читать книжки) И с вектором все ж таки разберусь до конца. --------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
По моему худший вариант смешивать С и С++ . Это чревато появлением кучи трудноуловимых ошибок. Лучше уж писать на чистом С и проводить все инициализации и перераспределения памяти руками. Т.е. всегда сам следишь за всем. Сам контролируешь время жизни структур данных и последовательность инициализации. Или же совсем забыть про С как про страшный сон и даже перестать использовать указатели в явном виде (Использовать классы, которые сами следят за своей памятью, которую они выделили в куче). -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
лучше заменить ручное распределение памяти на контейнеры:
Это сообщение отредактировал(а) baldina - 27.9.2012, 13:10 |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
ну вот я начал потихоньку заменять все на контейнеры, поэтому собственно тема и образовалась
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Чупакабро, начинать надо не изнутри, а снаружи. А по хорошему, почитай хорошую литературу, список приведен в "Ответах на часто задаваемые вопросы" (тема закреплена в разделе).
|
|||
|
||||
| rodnover |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: 2 Всего: 10 |
В С++ структура от класса отличается только тем, что в структуре члены класса по умолчанию публичные, а в классе приватные (если в новом, стандарте, конечно, этого не понимали) Есть такое правило выделять и освобождать память определенным методом. Если в С мы могли выделить память malloc, то и очищать мы его должны родственной функцией (free). Создание классов в С++ намного сложнее. Каждый член класса должен быть проинициализирован (иначе, он будет содержать просто мусор). В итоге, все члены класса (которые тоже может быть классами) запускают свои конструкторы (по просту говоря функции инициализации), которые будут запускать конструкторы и для встроенных членов. и так далее.. Для этого служит оператор new, который помимо выделения памяти еще и производит действия инициализации.. Оператор delete выполняет противоположные обязанности. Сначала производит определенные действия при удалении объекта, а потом очищает память. Все операторы, фактически, являются функциями, начинающимися с [b]operator[b]. в итоге
преобразуется к виду (как примерный показательный вариант)
где функция operator= просто копирует определенным образом объект из второго параметра в объект из первого параметра. Но, если первый параметр был выделене без инициализации (malloc), он будет скопирован в мусор. Поэтому все объекты в С++ надо выделять через оператор new, а удалять через delete. P.S. Для инициализации массивов объектов в С++ существует оператор new[] и обратный оператор delete []
|
||||||
|
|||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
// удаляем все
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
bsa, baldina, т.е. это
> Mech a* = new Mech[15] вас не смутило? Это сообщение отредактировал(а) borisbn - 29.9.2012, 00:50 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| NoviceF |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: 2 Всего: 2 |
Ну очипятка же.. что вы, право слово! Это сообщение отредактировал(а) NoviceF - 29.9.2012, 13:08 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |