使用静态std :: forward_list,调试器只显示第1个元素。
非静态std :: forward_list或静态std :: list工作正常。
我可以使用调试器中的任何工作吗?
#include "stdafx.h"
#include <forward_list>
#include <list>
int _tmain(int argc, _TCHAR* argv[])
{
static std::forward_list<int> sfl;
sfl.push_front( 1 );
sfl.push_front( 2 );
std::forward_list<int> fl;
fl.push_front( 1 );
fl.push_front( 2 );
static std::list<int> sl;
sl.push_front( 1 );
sl.push_front( 2 );
//Break here.
//In a debugger watch window:
// 'sfl' only shows the '2' element
// 'fl' & 'sl' shows all elements.
return 0;
}
答案 0 :(得分:0)
我相信这是Visual Studio调试器可视化工具中的一个错误。与我提出的解决方法最接近的是修改forward_list
中的autoexp.dat
条目(通常位于%VSINSTALLDIR%\Common7\Packages\Debugger\
中)
该文件应包含以下部分:
;------------------------------------------------------------------------------
; std::forward_list from <forward_list>
;------------------------------------------------------------------------------
std::forward_list<*>{
preview (
#(
"(",
#list(
head: $e._Myhead,
next: _Next
) : $e._Myval,
")"
)
)
children (
#list(
head: $e._Myhead,
next: _Next
) : $e._Myval
)
}
替换为:
;------------------------------------------------------------------------------
; std::forward_list from <forward_list>
;------------------------------------------------------------------------------
std::forward_list<*>{
preview (
#(
"(",
#(
$e._Myhead->_Myval,
",",
#list(
head: $e._Myhead->_Next,
next: _Next
) : $e._Myval,
),
")"
)
)
children (
#(
[actual 0]: $e._Myhead->_Myval,
#list(
head: $e._Myhead->_Next,
next: _Next
) : $e._Myval
)
)
}
这不是一个很好的解决方案。它会将子项显示为[actual 0], [0], [1], ...
而不是[0], [1], [2], ...
,即元素x
标记为[x-1]
。
但是,您可以在不关闭Visual Studio的情况下修改autoexp.dat
,只需重新启动调试器即可。因此,只要您需要调试特定问题,我就建议您使用此hack,然后恢复原始autoexp.dat
。