Использование векторов для инициализации массивов объектов для параметризованных конструкторов - PullRequest
0 голосов
/ 08 октября 2018

Я работаю с Visual Studio 2010 и относительно новичок в C ++.Программа, с которой я пытаюсь работать, имеет класс с параметризованным конструктором и деструктором в своем объявлении.Где-то в листинге было создание массива динамических объектов с использованием 'new'.Однако я столкнулся с проблемами, поскольку инициализация массива объектов для параметризованных конструкторов невозможна.

Я попытался реализовать векторы:

std :: vector my_object_array (длина, arg);// текущая попытка

my_object_array = new class_type [length] (arg);// предыдущий код

Однако, как только этот массив объектов создан, вызывается деструктор ~ вектора, и я получаю сообщение об ошибке во время выполнения «Отладка не подтверждена ... _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse)»

Основываясь на предыдущих подобных вопросах о SO, я думаю, что это из-за двойного удаления, но я не вызывал деструктор явно на этапах отладки, и я все еще получаю эту ошибку.

Любая помощьоценили!Спасибо!

Редактировать: Добавлены некоторые фрагменты кода с измененными именами.

class class_type {
  public:
    class_type(int var1);
    ~Class_type();
    /*

     Member functions

    */
  private:
    int var1;                        
    double var2;                   
    double length;                 
    double width;
    double* arr1;                  
};

Определение конструктора:

Class_type::Class_type(int il){
  length    = 0;
  width     = 0;
  var1    = il;
  var2   = 5;
  arr1 = new double[5];
}

Определение деструктора:

  Class_type::~Class_type(){

  delete [] arr1;}

Код, где возникает ошибка:

int class_type_2::create_my_objects(int num_elem){
   input_value = 10;
   if ( num_elem == 0 ) {
      std::cout<<"Warning!"<<endl;
   } else {
      std::vector<class_type> my_object_array(num_elem, input_value);
      //my_object_array= new class_type[num_elem](input_value);
        } //Debugger doesn't go beyond this step!
   return 0;
}

Ответы [ 2 ]

0 голосов
/ 08 октября 2018
std::vector my_object_array(length, arg); //current attempt

Ваш вектор может быть вне области, так как вы написали только одну строку.Так что невозможно точно ответить, что случилось с твоим.Я думаю, вы могли бы передать вектор другому конструктору копирования или перемещению конструктора, где он удаляет память и вызывает деструктор.

Как @Matthieu Brucher только что сказал, что вы должны сами управлять памятью, если она выделена с использованием «new».В противном случае двойное удаление является распространенной проблемой и могут возникнуть другие проблемы с памятью.

Edit1: я только что обновил после просмотра вашего кода

std::vector<class_type> my_object_array(num_elem, input_value);
} ---> when this scope hits it will release all stacked memory inside it and call their object constructors

Инициализируйте необработанный указатель с помощью nullptr.

double* arr1; // you have written
double* arr1 = nullptr;  // recommended

Редактировать 2:

Вы можете удалить память, если выделены с помощью malloc () или calloc ().в противном случае используйте вектор.он будет управлять вашей памятью без утечек.

0 голосов
/ 08 октября 2018

Если вы используете std::unique_ptr для вашего объекта вместо double*, вы увидите, что ваш код больше не компилируется.Это указывает на то, что в используемом вами коде используется конструктор копирования по умолчанию, и указатель будет скопирован в скопированный класс.

К сожалению, это означает, что несколько объектов будут иметь один и тот же указатель и попытаться освободить его, что не удастся.Если вы будете следовать хорошим практикам c ++ и никогда не звоните new и delete сами, вы больше не увидите этих проблем, потому что они заставят вас с самого начала правильно мыслить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...