[英]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
的存儲位置。 到目前為止, data
和tmp
指向相同的內存區域。 但是現在您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 * 2
和i
的最大值。 同樣,operator []擴展容器也是不直觀的。 當您調用[]
的大小大於容器的大小時,這應該是錯誤的,而不是重新調整數組的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.