【发布时间】:2013-06-16 05:58:30
【问题描述】:
我观察到 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()
}
};
是什么原因造成的?有没有人见过这个?有什么关于下一步看哪里的建议吗?
【问题讨论】:
-
您发布的代码也有同样的问题吗?我们可以用它来检查吗
-
@QWR 不,该代码当然不应该有同样的问题。我只是快速打字,所以请原谅任何错别字等。这是一个玩具示例;见en.wikipedia.org/wiki/Mutator_method#C.2B.2B_example
-
您是否在整个项目中使用 std::string 。或者您也将 char* 传递到某个地方。我怀疑这可能是原因。有如何在方法 stackoverflow.com/questions/175689/… 上实现显式关键字行为
-
项目的其他部分使用
char *,但没有任何代码使用char *。因为value是按值传递的,所以我认为这不是罪魁祸首。这意味着MyClass::myValue在某处被弄乱了,但它唯一被修改的地方是来自setValue()。我不确定explicit或重载是否适用于此。
标签: visual-c++ access-violation assignment-operator stdstring