2017-05-26 48 views
0
#include <iostream> 

using namespace std; 

template <class T> 
class myset{ 
private: 
    T *pArray; 
    int size; 

public: 
    myset<T>(){ 
     pArray = new T[0]; 
     int size =0; 
    } 

    void addItem(T iVal){ 
     size++; 
     T* newArray = new T [size];// allocate bigger array // 
     for(int i=0; i< size-1; i++){ 
      newArray[i] = pArray[i]; // IT IS CRASHING BECAUSE OF THIS LINE 
     } 
     pArray[size -1] = iVal; 
     pArray = NULL; 
     pArray = newArray; 
    } 
}; 

int main() 
{ 
    myset<int> a; 
    myset<double> d; 
    a.addItem(3); 
    a.addItem(5); 
} 

我想要做的是制作任何模板的动态数组。在我的add函数中,我试图将我的旧数组复制到我的新数组中。谁能告诉我为什么它不起作用?为什么我的程序在这一行中崩溃?

+1

你为什么在ctor中隐藏你的类的'size var? –

+2

你使用调试器时发现了什么? –

+4

*我想要做的是制作任何模板的动态数组* - 刚刚使用'std :: vector '有什么问题? – PaulMcKenzie

回答

4

在构造函数中,int size =0;正在声明并初始化一个名为size的新局部变量。它不初始化成员变量myset::size。这意味着当myset被构建时,myset::size将包含垃圾。即它可以从任何值开始。

另外,在addItem中,您将该项添加到旧数组而不是新数组中,然后放弃指向该数组而不释放其内存的指针,这会导致内存泄漏,并且新数组只包含垃圾。