2016-04-16 2 views
0

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

У меня есть класс

class Purpose{ 
public: 
    Purpose(){ 
    max   = 5; 
    elements  = 0; 
    obj_elements = 0; 
    arr   = new int[max]; 
    } 
    Purpose(const Purpose &a){ 
    max   = a.max; 
    elements  = a.elements; 
    obj_elements = a.obj_elements; 
    arr   = new int[elements] 
    for(int i = 0; i < elements; i++){ 
     arr[i] = a.arr[i] 
    } 
    } 

Add(){ 
    Purpose *tmp = new Purpose(*this); 
    arr_two[ obj_elements++ ] = tmp; 
} 
private: 
    int max; 
    int elements; 
    int obj_elements; 
    int *arr; 
    Purpose *arr_two[2]; 
} 

Я добавляю Интс внутри arr массива. Метод Add() создает копию текущего объекта и сохраняет его внутри массива arr_two, но когда я хочу напечатать элементы скопированного объекта, он выдает seg fault.

void Purpose::Print_It(){ 

     cout << arr_two[ obj_elements - 1 ] -> max << endl; 
     cout << arr_two[ obj_elements - 1 ] -> elements << endl; 
     cout << arr_two[ obj_elements - 1 ] -> obj_elements << endl; 
     for(int i = 0; i < arr_two[ obj_elements - 1 ] -> elements ; i++){ 
     cout << arr_two[ obj_elements - 1 ] -> arr[i] << endl 

     } 

    } 

Распечатка элементов обрывов seg. Другие атрибуты печатаются без проблем.

Что приводит к сбою/сбою программы при печати значений массива? Когда я печатаю значения массива внутри метода Add(), он работает.

+3

Каждый аспект этого кода абсолютно ужасно не рекомендуется. Есть ли какие-либо причины для этого, и почему вы не можете просто использовать 'std :: vector ' и сделать с ним? –

+0

Я хотел бы практиковать без использования вектора. – Darlyn

+1

Если вы просто практикуете, тогда это должно включать практику, выполняющую вашу собственную отладку. :) – nobar

ответ

1

Вы вызываете новый оператор [] с размером 0 (элементы инициализируются на 0)?

С cplusplus website на новом операторе [] в отношении параметра size_t:

Если этот аргумент равен нуль, то функция по-прежнему возвращает отчетливый непустой указатель на успехе (хотя разыменования этого указателя приводит к неопределенное поведение).

Смежные вопросы