2017-02-10 75 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次,嘿嘿。 –