重载下标运算符会导致访问冲突

时间:2012-05-30 11:05:16

标签: c++ operator-overloading

当我使用自编写的Buffer类时出现访问冲突错误:

template<typename T> 
class Buffer {
public:
    Buffer(T *data, size_t len);
    Buffer(size_t len);

    size_t len();

    operator T*();
    T& operator[] (const int x) const {
        return this->data[x];
    };

private:
    T *data;
    size_t _len;
};

int main() {
    Buffer<char> b("123", 3);
    b[0] = 0; // This line causes "Access violation writing location 0x003c8830".

    return 0;
}

为什么?我做错了什么?

4 个答案:

答案 0 :(得分:1)

导致问题的代码不在帖子中,但很可能是你的构造函数:如果你将指针data分配给成员data,那么你将字符串常量存储在你的类中。然后main的代码尝试写入不可写的内存,导致访问冲突。

您可以修复构造函数以避免此问题:

Buffer(T *dataIn, size_t len) {
    data = new T[len];
    memcpy(data, dataIn, len*sizeof(T));
}

答案 1 :(得分:1)

"123"是存储在只读存储器中的字符串文字 当你这样做时:

b[0] = 0

您正在尝试写入只读内存,从而调用未定义行为

您需要将动态内存分配给data,以便 拥有内存 ,然后您的代码会修改拥有的内存而不是非可写内存它不拥有。
此外,请务必遵循 Rule of Three

答案 2 :(得分:1)

字符串文字(如“123”)是不可写的。当你执行b [0] = 0;

时,尝试为其赋值

此外,字符串文字具有终止的NULL字符,使其长4。

您可以专门构造函数来复制const char输入。

答案 3 :(得分:1)

您没有显示构造函数的定义,但我敢打赌您正在使用赋值运算符将C字符串复制到Buffer::data。您需要使用strcpy()。此外,您需要为Buffer::data分配3 + 1个字节,以确保您有足够的空间容纳nul终结符。