动态内存中的数组大小调整功能

时间:2015-07-03 08:19:50

标签: c++ dynamic memory-leaks resize dynamic-memory-allocation

我正在创建一个函数来调整动态内存中的数组大小并且它不起作用..

这是代码:

template <class Type>
void Array<Type>::Resize(int newSize)
{
    if(newSize==size)
        return;
    if(newSize<=0)
        return;
    Type *temp = new Type[newSize];
    int min=(newSize>size)?size:newSize;

    for(int i=0; i<min; i++)
        temp[i]=elements[i];
    delete []elements;
    elements = temp;
    temp = NULL;
}

问题在于这两个陈述

delete []elements;
    elements = temp;

因为我评论它们时程序正常,

但它实际上并没有做应该做的事情。

我认为这个问题是在退出函数范围时被破坏的东西,我必须通过引用来调用它,但实际上我不能使它成为一个成员函数。

这是整个头文件:

#include<string>
#include<iostream>
using namespace std;

#ifndef ARRAY_H
#define ARRAY_H

template <class Type>
class Array
{
public:
    Array (int s);
    Array (const Array& obj);
    ~Array ();

    const Array& operator= (const Array& obj);

    Type GetElement (int index) const;
    void SetElement (Type ele, int index);

    void Resize (int newSize);

    void Print () const;
    void Destroy ();

private:
    int size;
    Type* elements;

};

    template <class Type>
    Array<Type>::Array(int s)
    {
        if(s<0)
            return;
        size=s;
            elements = new Type[size];
    }

    template <class Type>
    Array<Type>::Array(const Array &obj)
    {
        size = obj.size;
        elements = new Type[size];
        for(int i=0; i<size; ++i)
            elements[i]=obj.elements[i];
    }

    template <class Type>
    Array<Type>::~Array()
    {
        delete [] elements;
        elements = NULL;
        size = 0;
    }

    template <class Type>
    void Array<Type>::Destroy()
    {
        delete [] elements;
        elements = NULL;
        size = 0;
    }

    template <class Type>
    const Array<Type> &Array<Type>::operator=(const Array &obj)
    {
        if(this != &obj)
        {
            size = obj.size;
            if(elements != NULL)
                delete [] elements;
            elements = new Type[size];

            for(int i=0; i<size; i++)
                elements[i] = obj.elements[i];
        }
        return *this;
    }

    template <class Type>
    Type Array<Type>::GetElement(int index) const
    {
        if(index<0 || index>=size)
            cout << "Sorry, this operation can not be proceeded \n";
        else
            return elements[index];
    }

    template <class Type>
    void Array<Type>::SetElement(Type ele, int index)
    {
        if(index<0 || index>=size){
            cout << "Sorry, this operation can not be proceeded \n";
            return; }
        else
            elements[index] = ele;
    }

    template <class Type>
    void Array<Type>::Print() const
    {
        for(int i=0;i<size; ++i)
            cout << elements[i] << endl;
    }

    template <class Type>
    void Array<Type>::Resize(int newSize)
    {
        if(newSize==size)
            return;
        if(newSize<=0)
            return;
        Type *temp = new Type[newSize];
        int min=(newSize>size)?size:newSize;

        for(int i=0; i<min; i++)
            temp[i]=elements[i];
        delete []elements;
        elements = temp;
        temp = NULL;

    }

#endif

2 个答案:

答案 0 :(得分:1)

您忘记在Resize()函数中执行一项操作,即在重新分配后使用新大小更新成员size。这将导致它在具有较小新维度的调整大小后访问超出缓冲区末尾的内存,例如:

Array<int> arr(10);
// set the 10 values

arr.Resize(5);

// here the buffer will have 5 elements, but arr.size is still 10

arr.Print(); // this will read elements 0 - 9, not 0 - 4

答案 1 :(得分:-1)

观察结果

if(newSize==size)

尺寸不存在

delete []elements;
    elements = temp;

您正在尝试复制到刚刚删除的数组,该数组从未创建过。

“不起作用”和“程序是否正常”是什么意思?