5

我目前收到“0xC0000005:访问冲突读取位置 0xcccccce0”。错误,我已尝试诊断问题...我认为当我定义的 3 规则起作用并将我指向此处时,问题就出现了。

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

4 回答 4

9

未初始化时,如果使用 msvc 编译,堆栈变量将填充 0xCC 字节。所以 0xcccccce0 可能是“this”是堆栈上未初始化的指针变量加上对象结构中的 _MySize 偏移量的结果。

于 2012-04-10T09:34:03.270 回答
1

您的代码存在许多明显的问题:例如,您的析构函数执行 adelete [] _data和 a delete [] myArray,但 _data从未在默认构造函数中myArray 初始化,也从未在复制构造函数中初始化。如果例如new 失败,您的赋值运算符可以使对象处于无效状态。(一般来说,如果你必须测试自赋值,几乎可以肯定你的赋值运算符坏了。)这些问题中的任何一个都会导致未定义的行为,这可能会破坏可用空间领域,谁知道以后会出现什么问题。

不过,看看在哪里size被调用会很有趣。错误信息提示无效this;您使用无效地址调用了该函数。

于 2012-04-10T09:34:54.273 回答
0

断点/监视列表。我猜是空的。

于 2012-04-10T09:31:08.810 回答
0

我猜这是一个指针问题,但如果没有堆栈跟踪/回溯就无法判断。您在某个地址调用 size(),您认为该地址有一个 ArrayStorage 但没有。因为它是 0xccccce0 我会使用一个未初始化的指针。

例如,你有没有这样的东西

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

这将导致 this 或类似的错误,使 this 指针无效。

为什么要编写自己的 std::vector?

于 2012-04-10T09:39:36.957 回答