使用动态数组的C ++内存泄漏

时间:2016-05-14 23:54:20

标签: c++ arrays dynamic memory-leaks

我必须自己从头开始构建一个动态数组类,我也尝试用一个(set like)函数来扩展它,将新元素添加到数组中,它编译得很好,但程序崩溃,因为它有一些记忆泄漏。

请尽量帮助我,我在学校的通知时间很短。

数组类

template <class T>
class Array
{
    int n; /// size
    T* data;
public:
    explicit Array(int n): n(n) { adat=new T[n]; }
    Array(const Array&);
    Array& operator=(const Array&);
    ~Array();

    T& operator[](int idx) { return data[idx]; }
    int size() { return n; }
    int lookfor(T);
    void add(T);
    void del();
};

定义

template <class T>
Array<T>::Array(const Array<T>& t)
{
    n=t.n;
    data=new T[n];
    for (int idx=0; idx<n; ++idx)
        data[idx]=t.data[idx];
}

/**
    Operator=
*/
template <class T>
Array<T>& Array<T>::operator=(const Array<T>& t)
{
    if (this==&t) return *this;
        delete[] data;

    n=t.n;
    data=new T[n];
    for (int idx = 0; idx < n; ++idx)
        data[idx]=t.data[idx];

    return *this;
}

/**
    dtor
*/
template <class T>
Array<T>::~Array()
{
    del();
}

这一定是错误的部分

template <class T>
int Array<T>::lookfor(T el)
{
    for(int idx = 0; idx < n; ++idx)
        if(data[idx] == el)
            return idx;
    return -1;
}

/**
    add
*/
template <class T>
void Array<T>::add(T el)
{
    if(lookfor(elem) != -1)
    {
        T* temp = new T[n + 1];

        for (int idx = 0; idx < n; ++idx)
            temp[idx]=data[idx];

        temp[n + 1] = el;

        del();
        data = temp;
        ++n;
    }
}

template <class T>
void Array<T>::del()
{
    for(int idx = 0; idx < n; ++idx)
        delete data[idx];

    delete[] data;
}

失败的代码:

Control ctrl;

ctrl.add(new Room());
ctrl.add(new Room());

Control和Room都是数组的子类。喜欢Control:publicArray&lt;房间*&gt;

1 个答案:

答案 0 :(得分:2)

删除del()中删除所有data[idx]元素的循环。 data不是指针数组,它是T类型的值数组,因此您无法删除它们。即使您创建了一个指针数组,这些指针也会从调用方传递到add,并且它们由程序的该部分所有,而不是Array类。在向数组添加元素时,您也不想删除所有旧指针,因为新的data数组仍然包含这些指针。

对使用delete创建的内容调用new会导致未定义的行为,这可能会导致您的崩溃。