2017-02-10 70 views
0

崩潰,我似乎無法理解爲什麼我的程序成功運行,然後崩潰的析構函數。下面是我的main()源代碼(這非常簡單,它向一個創建相應類型的類模板發送了一個由5個變量組成的數組,我做了一些研究,似乎錯過了一些可能導致崩潰的東西, ?析構函數呼叫我有點fuzzled,它最有可能是簡單的解決計劃在析構函數

的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

'刪除[]'只能被稱爲爲構造下與'new' – Amadeus

+0

分配給類指針,PTR被分配的內存。 –

+0

@Tony Comito嗨,天才。構造函數和複製構造函數是無效的。您必須複製數組的元素,而不是分配臨時指針。 –

回答

0

- 在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次,嘿嘿。 –