2010-03-29 35 views
1

我使用operator()作爲下標操作是這樣的:運算符()爲下標(C++)

double CVector::operator() (int i) const 
{ 
if (i >= 0 && i < this->size) 
    return this->data[i]; 
else 
    return 0; 
} 

double& CVector::operator() (int i) 
{ 
return (this->data[i]); 
} 

它,當我得到價值的作品,但我得到一個錯誤,當我嘗試寫分配錯誤文本::在0x651cf54a (msvcr100d.dll)

未處理異常CG.exe:0000005:使用

a(i) = 1; 

UPD值 訪問衝突讀取地址 0xccccccc0。

+2

你會得到什麼錯誤?另外:你的行爲不一致。您在默認情況下會出現超出範圍的值,以便在寫入超出範圍時讀取和分段故障。 – 2010-03-29 22:26:56

+0

如果你正在編寫一些數組類,你可能決定自己做所有的內存管理?這意味着你需要定義編譯器自動定義的四種方法。如果你忘記了一個,那麼你會產生無效的內存位置。請發佈構造函數/析構函數和賦值運算符。 – 2010-03-30 07:12:05

回答

2

就像我在我的評論中說過的,問題在於你的缺陷設計。我對以下兩件事之一作出100%的保證:

  1. 您傳遞給賦值函數的值超出有效範圍。
  2. 成員data指向內存中的無效空間。

在任何情況下,我建議增加:

#include <cassert> 

並添加assert(i >= 0 && i < this->size)代替無聲故障:

double CVector::operator() (int i) const 
{ 
    assert(i >= 0 && i < this->size); 
    return this->data[i]; 
} 

double& CVector::operator() (int i) 
{ 
    assert(i >= 0 && i < this->size); 
    return (this->data[i]); 
} 
0

問題是您不檢查double&版本operator()的超範圍索引。

您可能不能保證data[i]指向一個足夠大的有效內存地址i。您應該檢查超出範圍的索引並拋出一些異常或調整矢量大小(通過分配更多內存來做data),以便能夠保存更多值。

1

這是因爲您沒有在double& CVector::operator() (int i)中執行錯誤處理,就像您爲其他重載()的函數所做的那樣。

將其更改爲:

double& CVector::operator() (int i) 
{ 
if (i >= 0 && i < this->size) 
{ 
    return this->data[i]; 
} 
else // Whatever manner you want to gracefully exit the program 
{ 
    std::cout<<"Out of bounds!"<<endl; 
    exit(1); 
} 
} 

你也應該考慮改變在其他功能的錯誤處理機制從return 0;更有意義。

1
在0x651cf54a (msvcr100d.dll)

未處理的異常在CG.exe中:0xC0000005: 訪問衝突讀取位置 0xccccccc0。

0xcc是MSVC未初始化的內存字節值。換句話說,您的問題很可能是由於訪問未初始化的指針或從未初始化的內存派生的指針。