Форум программистов CodeGuru
22 Июнь 2018, 09:22:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с динамическим массивом экземпляров класса  (Прочитано 2735 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Xuch
Новичок
*
Офлайн Офлайн

Сообщений: 3


Просмотр профиля
« : 25 Март 2013, 15:26:54 »

Всем привет!
 Прошу помощи с массивом экземпляров классов переменной длины. Опишу проблему.

 Итак заголовочный файл:

Код:
class SubClass
 {
 public:
 SubClass();
 string string1;
 string string2;
 string string3;
 string string4;
 string string5;

 int func1(void);
 gboolean func2(void);

 private:
 int Callback(void);
 }

 class MainClass
 {
 public:
 MainClass();
 int Init(int);
 SubClass *Class;
 string str1;
 string param2;
 }

 Далее в файле main.cpp:

Код:
int MainClass::Init(int q)
 {
 Class = malloc(q * sizeof(SubClass));
 .
 .
 .
 return 0;
 }
Далее при попытке записи в поле нулевого элемента массива экземпляра класса программа вываливается с ошибкой SegmentationFault:

 
Код:
MainClass.Class[0].string4 = "test string";
--> вылетает с ошибкой доступа к памяти

 Если писать в string1 то иногда проходит нормально, а иногда также вылетает ошибка.

 Явно тут проблема с выделением или доступом к памяти. С выделением вроде все нормально. В чем проблема не могу понять.

 Если объявляю как SubClass Class[MAX_ARRAY_SIZE], то никаких проблем вообще не возникает. Но мне нужно динамически задавать размер массива...

 Большое спасибо всем откликнувшимся!
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #1 : 01 Апрель 2013, 00:09:18 »

Если охота выделить массив объектов, то надо использовать оператор new.

При выделении памяти при помощи malloc не вызываются конструкторы объектов "массива". Соответственно, не вызываются конструкторы всей иерархии базовых классов, а также конструкторы всех включенных в класс объектов.

Короче, в вашем случае надо делать так:

Код:
Class = new SubClass[q];

А удалять этот массив надо так:

Код:
delete [] Class;
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!