我正在观察std::string
赋值运算符(=
)导致访问冲突写入LHS。在MSVC++调试模式下,LHS内部缓冲区指向一个无效地址。我不熟悉MSVC++ std::string
的内部,但我之前认为内部缓冲区指针永远不应该是无效的。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()
}
};
这是什么原因?有没有人见过这个?任何关于下一步看什么的建议?
您发布的代码也有同样的问题?我们可以用它来检查 – qwr
@QWR否,那个代码当然不应该有同样的问题。我只是很快打出来,所以没有任何错别字等。这是一个玩具的例子。请参阅https://en.wikipedia.org/wiki/Mutator_method#C.2B.2B_example – taz
你是否在整个项目中使用std :: string。或者你也可以在某处传递char *。我怀疑它可能是这个原因。有如何实现明确的方法关键字行为http://stackoverflow.com/questions/175689/can-you-use-keyword-explicit-to-prevent-automatic-conversion-of-method-parameter – qwr