簡體   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