2012-04-10 125 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