我正在观察一个std::string
赋值运算符 ( =
) 导致写入 LHS 的访问冲突。在 MSVC++ 调试模式下,LHS 内部缓冲区指向无效地址。我不熟悉 MSVC++ 的内部结构,std::string
但我之前曾假设内部缓冲区指针永远不应该是无效的。
使用 Visual Studio 调试器,我引用的内部缓冲区是char[]
实例成员std::string::_Bx::_Buf
。std::string
这通常保存由对象表示的以空字符结尾的字符串的地址。看来这std::string::_Bx._Ptr
也是一个char *
指向该地址的指针。
在某些情况下,我经常遇到这种情况,但我无法确定该地址如何或何时变得无效。如果有东西破坏了这个值,调试器不会提醒我吗?有没有办法将 Visual Studio 调试器设置为在std::string::_Bx::_Buf
访问写入时暂停?
在这种情况下,我无法提供SSCCE,因为我无法故意复制错误。调用错误的代码只是一个实例变量中的典型字符串值赋值,例如:
class MyClass {
protected:
std::string myValue;
public:
void setValue(std::string value) {
myValue = value; // ACCESS VIOLATION from std::string::operator=()
}
};
class OtherClass {
static myFunc() {
std::string myString("some value");
MyClass *myClass = new MyClass();
myClass->setValue(myString); // ACCESS VIOLATION from setValue()
}
};
什么可能导致这种情况?有没有人见过这个?关于下一步看哪里的任何建议?