【问题标题】:C++ Array Resize crashC++ 数组调整大小崩溃
【发布时间】:2016-05-18 16:27:15
【问题描述】:

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

    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];
    }

};  

错误来自操作员[]。(至少我认为)。 主程序是这样的:

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;
}

任何帮助都会很棒! :) 谢谢!

【问题讨论】:

    标签: c++ arrays loops crash resize


    【解决方案1】:

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

    data=tmp;
    delete[] tmp;
    

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

    然后,您尝试使用return data[i]; 访问该内存,但您将其删除!所以你得到一个分段错误。

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

    【讨论】:

      【解决方案2】:

      您删除了tmpoperator[] 中仍引用的新数组。因为这是data引用的新数组,所以难免会遇到麻烦。

      【讨论】:

        【解决方案3】:

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

        第二个问题是if(i&gt;siz) 检查是i 超出了数组的末尾,但您永远不会检查i 是否也大于newsize。您需要将newsize 设置为siz * 2i 中的最大值。 operator[] 增长容器也是不直观的。当您调用 [] 时,其大小大于容器的大小,这应该是一个错误,而不是重新调整数组的大小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-11
          • 2013-11-02
          • 1970-01-01
          • 2021-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          相关资源
          最近更新 更多