Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 25.03.2013, 15:16   #1
Xuch
Пользователь
 
Регистрация: 25.03.2013
Сообщений: 36
Репутация: 10
По умолчанию Проблема с массивом экземпляров класса переменной длины

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

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

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;
}

From Stilet: Код попрошу оформлять по правилам!

Далее при попытке записи в поле нулевого элемента массива экземпляра класса программа вываливается с ошибкой SegmentationFault:

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

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

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

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

Большое спасибо всем откликнувшимся!

Последний раз редактировалось Stilet; 25.03.2013 в 17:06.
Xuch вне форума   Ответить с цитированием
Старый 25.03.2013, 16:15   #2
Abstraction
Профессионал
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,182
Репутация: 655
По умолчанию

0) Оформляйте программный код тегом форума Code.

1) Не называйте типы и переменные одинаково. Запись Class = malloc(q * sizeof(SubClass)) мне пришлось осознавать секунд двадцать.

2) MainClass.Class - бессмысленное выражение. Оператор доступа к члену '.' неприменим к имени типа. Компилятор должен был выдать ошибку. Раз он у Вас её не выдал, что-то сильно не так. Приведите контекст, в котором используете строку MainClass.Class[0].string4.

3) Есть malloc - должен быть free. Железное правило. Даже теоретически не вижу в Вашем коде, где он мог бы быть.
Abstraction вне форума   Ответить с цитированием
Старый 25.03.2013, 16:53   #3
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,562
Репутация: 1743
По умолчанию

В догонку - не используйте malloc/free для классов - для этого есть new/delete.
Я не знаю, что у вас string, но если это класс и память выделяете через malloc, то тогда у string не срабатывают конструкторы, ну и далее при доступе к string переменным все ломается ибо в них "мусор".
waleri вне форума   Ответить с цитированием
Старый 25.03.2013, 20:51   #4
Xuch
Пользователь
 
Регистрация: 25.03.2013
Сообщений: 36
Репутация: 10
По умолчанию

Спасибо за ваши замечания!
Насчет доступа к члену класса я конечно ошибся когда упрощал код - в main.cpp определяется экземпляр и уже к его членам осуществляется доступ:

Код:

MainClass Test;
Test.Class[0].string4 = "test string";

free() есть отдельно, просто я когда упрощал код его выкинул как не относящегося к сути вопроса.

А почему при malloc() для string не срабатывают конструкторы? Это точно так? Где про это можно почитать?
Xuch вне форума   Ответить с цитированием
Старый 26.03.2013, 12:13   #5
Abstraction
Профессионал
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,182
Репутация: 655
По умолчанию

Цитата:
А почему при malloc() для string не срабатывают конструкторы? Это точно так? Где про это можно почитать?
Там же, где и про то, что при вызове malloc() не происходит форматирования жёсткого диска: нигде. malloc(), как указано в её описании и положено по стандарту, делает ровно одну вещь: выделяет память. Она не обнуляет эту память, не вызывает конструкторов - ничего сверх этого. Обратите внимание, что "с точки зрения" malloc ей на вход подали одно целое число - количество байт требуемой памяти; у неё в принципе нет информации о том, как Вы этой памятью собрались в дальнейшем воспользоваться.
Abstraction вне форума   Ответить с цитированием
Старый 26.03.2013, 13:00   #6
Xuch
Пользователь
 
Регистрация: 25.03.2013
Сообщений: 36
Репутация: 10
По умолчанию

Понятно
Спасибо большое!
Xuch вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача в Delphi:Составить описание класса многочленов от одной переменной, задаваемых степенью многочлена и массивом коэффициентов Nyasha Помощь студентам 1 08.11.2012 08:28
массив экземпляров класса flibustier912 Visual C++ 1 05.05.2012 01:00
Создание экземпляров класса MuradS60 Общие вопросы C/C++ 1 01.04.2012 18:21
Копирование экземпляров класса 3D Hunter Общие вопросы Delphi 14 29.08.2011 12:46
2-мерный динамический массив экземпляров класса. С++ Парсифаль Общие вопросы C/C++ 1 29.12.2009 15:35


10:33.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru