【问题标题】:Array resize function in dynamic memory动态内存中的数组调整大小功能
【发布时间】:2015-09-21 00:11:32
【问题描述】:

我正在制作一个函数来调整动态内存中数组的大小,但它不起作用..

代码如下:

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

【问题讨论】:

  • elements 是如何分配的? Array 是否跟随 Rule of Three,因为它拥有资源?换句话说,请发MCVE
  • @nilo:这实际上应该是正确的方法 - 他取消分配旧数组并将指针分配给新分配的数组。这有什么问题?

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


【解决方案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

【讨论】:

  • 好的,但我不明白现在如何让它工作? :\
  • Array::Resize() 中,当您设置elements 指向您分配的新缓冲区时,您还必须更新大小,例如size = newSize;
  • 谢谢我的朋友,我做到了,而且效果很好!元素 = 新类型 [newSize]; for(int i=0; i
  • 我不确定我是否正确理解了您评论中的片段,但看起来您正在第二次分配缓冲区,这不是必需的。您只需要在原始实现中的elements = temp; 之后执行size = newSize;
  • 是的.. 好的,我会尝试,如果它有效,当然会更好
【解决方案2】:

几个观察结果

if(newSize==size)

大小不存在

delete []elements;
    elements = temp;

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

“不工作”和“程序正常工作”是什么意思?

【讨论】:

  • 我们大概可以假设sizeelementsArray 类的成员,所以它们是被定义的。这两行不会复制到刚刚删除的数组中,它们会删除旧数组,然后将指针分配给新分配的数组,这看起来是有效的(至少从上面显示的小代码来看)。
  • 这可能是正确的 lonut。但是我的答案是否应该被打分,仅仅是因为我想了解更多信息吗?
  • lonut 所说的解释了一切。如果您需要,我可以发布整个头文件吗?
  • @SaifBadran 请向我们展示完整的班级定义,并且按照日志的要求,准确告诉我们您的意思是指正常工作不做应该这样做(最好是一个工作代码的小例子)。
  • @lonut 好的,我已经编辑了问题并添加了所有方法的类定义和实现。我的意思是当我评论这两行时,程序没有错误地工作并给出完整的输出,但没有调整数组的大小。但是当这两行出现时,我没有收到语法错误,它只是给出前几行输出,然后程序停止工作,windows 给出一条消息(project.exe 已停止工作)并且不会继续运行。
猜你喜欢
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 2017-04-18
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多