当我使用自编写的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;
}
为什么?我做错了什么?
答案 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终结符。