2010-03-29 77 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未初始化的内存字节值。换句话说,您的问题很可能是由于访问未初始化的指针或从未初始化的内存派生的指针。