![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Привет народ!
Такая гадость: при создании динамического массива классов (malloc, calloc) не работают конструктор и деструктор! Что делать-то? Вот пример: Class myclass { public: int I; myclass() { I = 0; } }; func () { myclass* pMClass = (myclass*)calloc(10, sizeof(myclass)); } после этого pMClass[0].I может быть равно какому-нибудь бреду, вроде -42987324, хотя calloc должен обнулять выделяемую память! |
|||
|
||||
<Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: нет Всего: 64 |
Fixin На сколько я знаю, экземпляр класса в Си создается при помощи new.
Это сообщение отредактировал(а) <Spawn> - 22.7.2004, 22:02 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
malloc/free - это функции из библиотеки языка Си и ничего не знают о конструкторах и деструкторах. Если ты пишешь на Си++, то используй только операторы new и delete. Даже если выделяешь память не для объекта класса, а для простого int.
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Да и вообще надо пользовать std::vector<myclass> my_class_arr(count). Как раз конструктор по умолчанию свой пишешь.
|
|||
|
||||
Fixin |
|
||||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Привет!
Я кое-что выяснил: у меня в классе есть динамический массив другого, внутреннего класса. Calloc выделяет область, где есть расчет только на !указатель! внутреннего класса, а когда я создаю внутренний динамический массив, область внут. идет следом за памятью текущего индекса массива главного класса. Поэтому происходит налезание на след. элемент. Class myclass2 { public: int j; }; Class myclass { public: int i; myclass2* pMClass2; void Func(void) { pMClass2 = (myclass2*)calloc(i, sizeof(myclass2)); } }; void MainFunc() { myclass* pMClass = (myclass*)calloc(10, x*sizeof(myclass2)+sizeof(myclass)); } вроде так, но это еще нужно проверить.
Не люблю готовые решения и библиотеки. в другом случае можно просто использовать один билдер.
Я создаю массив а не экземпляр.
А знать им совсем не обязательно. Конструктор выполняет программа при создании экземпляра во время работы. А в моем случае calloc обнуляет все после создания поэтому все будет равно нулю. А почему получился этот бред я объяснил выше. Это сообщение отредактировал(а) Fixin - 23.7.2004, 20:59 |
||||||
|
|||||||
gray_k |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
А STD поддерживают все компиляторы Си++. Это стандарт.
Ты создаёшь массив указателей. И вообще по стандарту надо использовать new и delete. -------------------- С уважением. Gray. |
||||
|
|||||
Fantasist |
|
||||||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
STL ![]()
Тогда malloc тоже не используй! Это тоже часть стандартной библиотеки С++ (как и STL).
Не знаю, что ты называешь конструктором, но если говорить в терминах С++, то конструктор - это специальный метод класса, который вызывается только неявно при создании классов. А значит либо при помощи new, либо при создании переменной на стеке, ну и при создании глобальной переменной. Короче, если ты работаешь с классами, то используй new/delete и только их. Разве что кроме тех случаев, где ты хочешь создать хитрый менеджмент памяти (тогда придется использовать placement new). -------------------- Волны гасят ветер... |
||||||
|
|||||||
chipset |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
имхо он имел в виду namespace std. Хотя в общем ты прав..
Нифига не используй а пиши на асме! ![]()
IMHO бред... Это сообщение отредактировал(а) chipset - 24.7.2004, 08:32 --------------------
|
||||||||
|
|||||||||
Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Научите тогда: покажите пример динамического массива классов, каждый из элементов которого, содержит дин. массив другого класса. И все это только при помощи new, и чтобы это не были ни связный список, ни вектор.
|
|||
|
||||
Fantasist |
|
||||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Если хочеться создавать массив экземпляров B инициализировар их каким-то размером, который известен на этапе компиляции, можно дописать такую примочку:
-------------------- Волны гасят ветер... |
||||
|
|||||
Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Я не знал, что с помощью new можно создавать массивы! Спасибо!
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |