Visual Studio调试监视中的不同_fileName值

时间:2014-12-04 06:08:09

标签: c++ visual-studio debugging openscenegraph

std :: string filename;

在此代码中:osg::Image* image = osgDB::readImageFile(filename + ".dicom");

osg ::图像类型变量:图像从读取文件返回错误的值。通过调试上面的行,监视窗口显示如下: enter image description here

第一行和第二行上指示的_fileName(std :: string type)值都是“摘要”,但在第四行中,_fileName的值结果为“iiiiii \ x * 6”,容量等于0

根据我的理解,监视窗口中第四行的_fileName应该在第一行和第二行指示与osg :: Image相同的成员变量作为_fileName。因此,我认为调试监视窗口中的所有_fileName应该具有相同的值。但是,我不确定为什么会有这样的差异。

2 个答案:

答案 0 :(得分:1)

由于某种原因,当文件名变成_filename时,你的文件名参数就不会得到.dicom("摘要"应该变成" digest.dicom")。 OSG决定通过扩展使用哪个插件来加载文件,因此它不知道如何加载当前的插件。所以对_filename的第二个引用并没有被任何插件初始化。

顺便说一句,我不认为dicom插件是标准OSG预构建软件包的一部分 - 您可能必须自己收集依赖项并构建插件。

答案 1 :(得分:1)

std::string的MSVC ++实现对短字符串和长字符串使用不同的存储策略。短字符串(16个字节或更少)存储在直接嵌入std::string对象内的缓冲区中(您将在原始视图中将其视为_Bx._Buf)。长字符串存储在一个独立分配的内存块中(位于_Bx._Ptr)。

如果您违反std::string对象的完整性,您可能很容易陷入您描述的情况。对象认为数据应该存储在外部缓冲区中,但实际上它存储在内部缓冲区中,反之亦然。这也可能很容易混淆调试器。

我建议您打开std::string对象的原始视图,并检查它在_Bx._Buf_Bx._Ptr中显示的内容。如果当前_Myres值小于或等于内部缓冲区大小,则数据[应该]存储在内部缓冲区中。否则,它存储在外部存储器块中。看看这个不变量是否真的成立。如果没有,那就是你的问题。然后你就必须找到它被破坏的地方。