2017-02-10 2 views
0

Я не могу понять, почему моя программа работает успешно, а затем сбой при деструкторе. Ниже приведен мой основной() исходный код (который довольно прост, он отправляет массив из 5 переменных в шаблон класса, который создает соответствующий тип. Я провел некоторое исследование и, похоже, отсутствовал что-то, что может вызвать сбой из-за дополнительной ? вызов деструктора Я немного fuzzled, и это, скорее всего, простое исправлениеПрограмма Crashing at Destructor

main.cpp:. содержимое файла

int main() 
{ 
// using integer data type 
int arraya[5] = { 1, 2, 3, 4, 5 }; 
GenericArray<int> a(arraya, 5); 
a.print(); 

// using float data type 
float arrayb[5] = { 1.012, 2.324, 3.141, 4.221, 5.327 }; 
GenericArray<float> b(arrayb, 5); 
b.print(); 

// using string data type 
string arrayc[] = { "Ch1", "Ch2", "Ch3", "Ch4", "Ch5" }; 
GenericArray<string> c(arrayc, 5); 
c.print(); 
return 0; 
} 

заголовка:

#ifndef GENERIC_ARRAY_H 
#define GENERIC_ARRAY_H 

#include<string> 
#include<iostream> 

template<typename type> 
class GenericArray 
{ 
public: 
    GenericArray(type array[], int arraySize); // constructor 
    ~GenericArray(); // destructor 
    void print();  // the print function 
    GenericArray(const GenericArray &obj); //copy constructor 
private: 
    type *ptr; //new pointer of respective type 
    int size; 
}; 

template<typename type>//print() function 
void GenericArray<type>::print() 
{ 
    for (int index = 0; index < size; index++) 
    { 
     cout << ptr[index] << " "; 
    } 
    cout << endl; 
} 

template<typename type>//Constructor 
GenericArray<type>::GenericArray(type array[], int arraySize) 
{ 
    size = arraySize; 
    ptr = new type[size]; 
    ptr = array; 
} 

template<typename type>//Destructor 
GenericArray<type>::~GenericArray() 
{ 
    cout << "Freeing Memory!"; 
    delete[] ptr; 
} 

template<typename type>//Copy Constructor 
GenericArray<type>::GenericArray(const GenericArray &obj) 
{ 
    *ptr = *obj.ptr; 
} 

#endif 
+0

'delete []' может вызываться только для указателя, выделенного с помощью 'new' – Amadeus

+0

под конструктором класса, ptr выделяется память. –

+0

@ Тони Комито Привет, гений. Конструктор и конструктор копирования недействительны. Вам нужно скопировать элементы массива вместо назначения временного указателя. –

ответ

0

-in методом print() :

Небезопасно, чтобы в ячейках памяти была выделена память ptr ... (ptr + size - 1), поэтому вы можете столкнуться с ошибкой сегментации.

constructor:

вы выделяете память через new, но затем немедленно перенаправить указатель на точку в том же положении, как array указывает на. , Это означает, что вы получили утечку памяти.

destructor:

Как уже упоминалось выше, ваша программа падает здесь, когда destructor называется, потому что удалить [] не работает на память, которая была выделена с new, см constructor замечания ,

copy constructor:

Есть две проблемы. Прежде всего, вы не можете разыменовать lhs-ptr, потому что для него не было выделенной памяти. Более того, если была память, выделенная для ptr, оператор *ptr = *obj.ptr; бы просто скопировать первый элемент obj.ptr (если есть память, выделенная в этом положении, а) к первому элементу ptr .`

+0

Спасибо! Он работает корректно, так как я исправил проблемы, возникшие вами и написал в операторе присваивания копий. –

+0

@TonyComito Стоит прочитать: [Что такое правило трех?] (Http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) Это, к сожалению, недостаточно изучено. – user4581301

0

Конструкторы определены неправильно , Они должны копировать элементы исходных объектов.

Например

#include <algorithm> 

//... 

template<typename type>//Constructor 
GenericArray<type>::GenericArray(const type array[], int arraySize) 
    : ptr(new type[arraySize]), size(arraySize) 
{ 
    std::copy(array, array + arraySize, ptr); 
} 


template<typename type>//Copy Constructor 
GenericArray<type>::GenericArray(const GenericArray &obj) 
    : ptr(new type[obj.size]), size(obj.size), 
{ 
    std::copy(obj.ptr, obj.ptr + arraySize, ptr); 
} 

Кроме того, необходимо определить оператор присваивания копии.

+0

Спасибо! Я написал в операторе присваивания копии! вместо использования функции копирования, которую я вручную написал в цикле for, чтобы назначить каждого члена. Программа работает правильно! Мне просто нужно выяснить, почему он звонит деструктору 4 раза, хе-хе. –