1

I use operator() as a subscript operator this way:

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]);
}

It works when I get values, but I get an error when I try to write assign a value using

a(i) = 1;

UPD: Error text:

Unhandled exception at 0x651cf54a (msvcr100d.dll) in CG.exe: 0xC0000005: Access violation reading location 0xccccccc0.

4

4 回答 4

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]);
}
于 2010-03-29T22:37:54.610 回答
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;更有意义的方式更改。

于 2010-03-29T22:33:40.463 回答
1

CG.exe 中 0x651cf54a (msvcr100d.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0xccccccc0。

0xcc是 MSVC 未初始化的内存字节值。换句话说,您的问题很可能是由于访问未初始化的指针或从未初始化的内存派生的指针。

于 2010-03-29T23:07:44.460 回答
0

问题是你没有在你的double&版本中检查超出范围的索引operator()

您可能无法保证data[i]指向足够大的有效内存地址i。您应该检查超出范围的索引并抛出一些异常或调整向量的大小(通过分配更多内存 do data)以能够容纳更多值。

于 2010-03-29T22:33:09.403 回答