Visual C ++ Express,调试器,排序关联容器和内存释放

时间:2009-11-21 12:44:57

标签: c++ dictionary stl set visual-studio-express

所以你有这个简单的程序从文件中创建std::set

#include <fstream>
#include <string>
#include <set>

int main()
{
 std::set<std::string> Sdictionnary;
 std::set<std::string>::const_iterator it = Sdictionnary.begin();

 std::ifstream file("french.txt"); // A file containing 200 000 lines
 std::string line;
 while(getline(file,line))
 {
  it  = Sdictionnary.insert(it, line);
 }
 file.close();
 return 0;
}

当您在Visual Express之外启动此程序时,它将在大约半秒内启动和关闭。

如果使用调试器在Visual Express中启动此程序,则在调试或释放模式下,它将在20到25秒后关闭。 如果你设一个断点,返回0;你在退出之前得到了25秒。如果你在25秒内暂停程序,Visual Express将转到xmemory:

 void deallocate(pointer _Ptr, size_type)
  { // deallocate object at _Ptr, ignore size
  ::operator delete(_Ptr);
  }

std::map也会发生这种情况。但不是std::unordered_setstd::vector。所以问题是,为什么Visual Express花了这么多时间用某种关联容器解析内存(排序的?)?

2 个答案:

答案 0 :(得分:0)

你在观察窗口有任何表达吗?

在观察表达式时,调试器必须定期检查程序是否进入了定义表达式的上下文。因此,它大大减缓了执行速度。在调试其他内容时输入的旧表达式或者甚至其他程序可能已经停留在那里,因此请查看监视窗口并删除所有内容。

此建议对条件断点也有效。

答案 1 :(得分:-1)

当使用带有提示迭代器的insert()函数时,你应该确保它实际上是一个提示。如果插入没有提示迭代器的项目会发生什么?

Sdictionnary.insert(line);