繁体   English   中英

C ++数组调整大小崩溃

[英]C++ Array Resize crash

我有一个使用模板并具有大小的简单数组类。 我想在它满的时候调整它的大小,但是我的程序不断崩溃。 代码是这样的:

    template<class T>
class Buffer:public File_ptr
{

    unsigned int siz;
    T *data;


public:

    ///konstruktor(size,filename,openmode)
    Buffer(unsigned int s=50,const char* n, const char* m):File_ptr(n,m),siz(s)
    {
        data= new T[siz];
        for(unsigned int i=0; i<siz; ++i)
        {
            data[i]=0;
        };
    };

    ///destruktor
    ~Buffer()
    {
        delete[] data;
    }

    ///operator[]
    T& operator[](unsigned int i)
    {
        if(i>siz)
        {
            unsigned int newsize=siz*2;
            T* tmp=new T[newsize];
            for(unsigned int j = 0; j < siz; j++)
            {
                tmp[j] = data[j];
            }
            siz=newsize;
            delete[] data;
            data=tmp;
            delete[] tmp;
        };
        return data[i];
    }

};  

错误出现在operator []。(至少我认为)。 主程序是这样的:

int main()
{
   Buffer<int> k(20,"k.txt","w");
   Buffer<char*> s(20,"s.txt","w");
   k.printfile("HEY");
   s.printfile(5);
   for(unsigned int i=0;i<23;i++){
    s[i]="Hey";
    cout << s[i] << endl;
   }


return 0;
}

任何帮助将是巨大的! :) 谢谢!

您遇到了分段错误,因为您两次删除了内存。

data=tmp;
delete[] tmp;

在这里,您为data分配了tmp的存储位置。 到目前为止, datatmp指向相同的内存区域。 但是现在您delete[] temp; ,因此将删除内存区域。 但是因为data也指向它,所以data也不再有效用作指针(如tmp )。

然后, return data[i]; 您正在尝试访问该内存,但已将其删除! 因此您会遇到细分错误。

您可以通过 delete[] tmp;来解决此问题delete[] tmp; ,因为data指向有效的内存位置,所以一切都很好:)

您删除了仍由operator[]中的tmp引用的新数组。 由于这是data引用的新数组,因此不可避免地会遇到麻烦。

你有几个问题。 第一个问题是删除tmp指向的内存,这也是data现在指向的内存。 这意味着下一次数组增长时,您将访问未定义行为的已删除指针。

第二个问题是if(i>siz)检查i是否超出了数组的末尾,但您从未检查过i是否也大于newsize 您需要将newsize设置为siz * 2i的最大值。 同样,operator []扩展容器也是不直观的。 当您调用[]的大小大于容器的大小时,这应该是错误的,而不是重新调整数组的大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM