2012-04-10 151 views
2

我目前得到一個「0000005:訪問衝突讀取位置0xcccccce0」錯誤和我已經嘗試診斷問題...我認爲問題出現時,我已定義3的規則來玩,並指向我在這裏。C++讀訪問衝突錯誤

size_type size() const 
    { // return length of sequence 
    return (this->_Mysize); <---------------------this line 
    } 

我實際上並不確定是否有任何問題,我一直在這裏住了幾天。

下面是我的三個

ArrayStorage::ArrayStorage(){ 
    myArray = new string[7079]; 
} 

ArrayStorage::~ArrayStorage(){ 
    delete[] _data; 
    delete[] myArray; 
} 

ArrayStorage::ArrayStorage(const ArrayStorage &A) { 
    _size = A.size(); 
    _data = new string [size()]; 
    for (int i = 0; i < size(); ++i) 
     _data[i] = A[i]; 
} 

ArrayStorage& ArrayStorage::operator=(const ArrayStorage &A){ 
    if (this != &A) { 
     delete [] _data; 
     _size = A.size(); 
     _data = new string [A.size()]; 
     for (int i = 0; i < size(); ++i) { 
      _data[i] = A[i]; 
     } 
    } 
    return *this; 
} 

const string& ArrayStorage::operator[](int i) const{ 
    assert((i >= 0) && (i < size())); 
    return _data[i]; 
} 

string& ArrayStorage::operator[](int i){ 
    assert((i >= 0) && (i < size())); 
    return _data[i]; 
} 
+2

回溯跟蹤將是有益的在這裏 – daramarak 2012-04-10 09:27:53

+1

是否檢查'this'是有效的?你有沒有從調試器回溯(你沒有在調試器中檢查應用程序?)?你爲什麼試圖實現你自己的「數組」,而不是使用任何像std :: vector這樣的標準容器? – 2012-04-10 09:31:37

+0

我猜想這是一個指針問題,但如果沒有堆棧跟蹤/回溯就無法判斷。某處你在一個地址上調用size()的地方,你認爲有一個ArrayStorage,但沒有。由於它是0xccccce0我會去與一個單位化的指針。 – dutt 2012-04-10 09:31:50

回答

5

未初始化時,堆棧變量都充滿了的0xCC字節,如果用MSVC編譯。因此,0xcccccce0可能是「this」是堆棧中未初始化的指針變量加上對象結構中的_MySize偏移量的結果。

+1

這是一個很好的提示。他能定義一個'ArrayStorage *',而不是用'new'初始化它嗎? – 2012-04-10 09:36:41

+0

最有可能。如果編譯器正在優化代碼並使用方法內聯,則將size()轉換爲直接字段訪問,繞過vtable並導致此訪問衝突。 – 2012-04-10 09:44:02

+0

什麼vtable?我還沒有看到任何讓我相信「尺寸」是虛擬功能的東西。 – 2012-04-10 10:39:26

0

斷點/監視列表的規則。我猜這個是空的。

1

有一些明顯的問題與您的代碼:你的析構函數, 例如,做了delete [] _datadelete [] myArray,但 _data永遠不會在你的默認構造函數初始化,myArray 在拷貝構造函數永遠不會初始化。例如,如果例如 ,操作員可以使對象處於無效狀態。 new 失敗。 (一般情況下,如果你要測試的自我分配,它的 幾乎可以肯定,你的賦值運算符是壞了。)任何的 這些問題導致不確定的行爲,這可能會破壞自由 空間與舞臺,引起誰知道是什麼問題以後。

儘管如此,它會看到那裏size被稱爲是有趣。 錯誤消息提示無效this;你用一個無效地址調用了 函數。

0

我想這是一個指針的問題,但它不可能說沒有堆棧跟蹤/原路返回。某處你在一個地址上調用size(),你認爲有一個ArrayStorage,但沒有。由於它是0xccccce0我會去與一個單位化的指針。

例如,你有這樣的事情

ArrayStorage storage1; 
ArrayStorage* storage2; 
*storage2 = storage1; 

這將導致本或類似的錯誤,無效this指針。

爲什麼你寫你自己的std :: vector的?

+0

你的第二個例子不會編譯;沒有初始值設定項就無法定義參考。 – 2012-04-10 10:40:24

+0

謝謝,刪除它。 – dutt 2012-04-10 10:44:56