0

使用自写的 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

4 回答 4

1

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

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

Buffer(T *dataIn, size_t len) {
    data = new T[len];
    memcpy(data, dataIn, len*sizeof(T));
}
于 2012-05-30T11:09:14.357 回答
1

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

b[0] = 0

您正在尝试写入只读内存,从而调用Undefined Behavior

您需要分配动态内存,data以便它拥有内存,然后您的代码修改拥有的内存,而不是它不拥有的不可写内存。
另外,请确保您遵循三法则

于 2012-05-30T11:10:52.430 回答
1

诸如“123”之类的字符串文字是不可写的。当您执行 b[0] = 0; 时,您尝试为其分配一个值;

此外,字符串文字有一个终止 NULL 字符,使 4 变长。

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

于 2012-05-30T11:10:55.410 回答
1

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

于 2012-05-30T11:11:32.180 回答