分段错误c ++模板

zub*_*hta 0 c++ templates segmentation-fault

我在可扩展阵列上编写了我的第一个C++模板代码,我遇到了分段错误!经过一个小时的调试后,我意识到我需要帮助.我认为构造函数或析构函数有问题但不确定.

代码是在准备编译的pastie上. http://pastie.org/1150617

/* Expandable array in C++ */

#include <iostream>
using namespace std;

template <class T>
class EArray{
private:
    T* arr;
    int size;
public:
    EArray(int l);
    ~EArray();

    void setElement(int i, const T& newval);
    void eraseElement(int i);
    void addElement(int i, const T& newval);
    void push(const T& newval);
    void display();
};

template <class T>
EArray<T>::EArray(int l){
    size = l;
}

template <class T>
EArray<T>::~EArray(){
    delete [] arr;
    arr = NULL;
}

template <class T>
void EArray<T>::setElement(int i, const T& newval){
    if(i < size && i >= 0){
        arr[i] = newval;
    }
}

template <class T>
void EArray<T>::eraseElement(int index){
    size -= 1;
    T* newarr = new T[size];
    for (int i = 0; i < size+1; i++){
        if (i < index){
            newarr[i] = arr[i];
        }
        else if(i > index){
            newarr[i-1] = arr[i];
        }
    }
    delete [] arr;
    arr = newarr;
}

template <class T>
void EArray<T>::addElement(int index, const T& newval){
    size += 1;
    T* newarr = new T[size];
    for(int i = 0; i < size; i++){
        if(i<index){
            newarr[i] = arr[i];
        }
        else if (i == index){
            newarr[i] = newval;
        }
        else{
            newarr[i] = arr[i-1];
        }
    }
    delete [] arr;
    arr = newarr;
}

template <class T>

void EArray<T>::push(const T& newval){
    size += 1;
    T * newarr = new T[size];
    for (int i = 0; i < size-1; i++){
        newarr[i] = arr[i];
    }
    newarr[size-1]=newval;
    delete [] arr;
    arr = newarr;
}

template <class T>
void EArray<T>::display(){
    for(int i = 0; i < size; i++){
        cout << arr[i] << endl;
    }
}

int main(){
    EArray<int> A(6);
    A.setElement(0,34);
    A.setElement(1,544);
    A.setElement(2,32);
    A.setElement(3,324);
    A.setElement(4,24);
    A.display();
    A.addElement(3,12);
    A.display();
    A.eraseElement(4);
    A.display();
    A.push(32456);
    A.display();
}
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 12

它与模板无关.这只是内存管理的问题.在构造函数中EArray,您从未初始化arr,因此默认情况下它包含一些无效指针.

但是之后setElement,您使用了这个无效指针arr[i] = newval;,这应该会导致SegFault.

应该通过添加来修复它

arr = new T[size];
Run Code Online (Sandbox Code Playgroud)

在构造函数中(结果:之前,使用segfault - 之后,运行正常).

(顺便说一句,在实践中,请使用std::vector.)