开发者

Visual C++ Express, the debugger, sorted associative containers and memory deallocation

So you have this simple program that creates a std::set from a file :

#include <fstream>
#include <string>
#include &开发者_运维问答lt;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;
}

When you launch this program outside of Visual Express, it will start and close in about half a second.

If you launch this program inside Visual Express with the debugger, in Debug or Release mode, it will close 20 to 25 seconds later. If you put a breakpoint, at return 0; you get your 25 seconds just before exit. And if you pause the program during the 25 seconds, Visual Express will go to xmemory :

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

This is also happening with std::map. But not with std::unordered_set or std::vector. So the question is, why Visual Express is taking so much time deallocating memory with certain kind of associative containers (sorted ones ??) ?


do you have any expression in the watch window ?

when watching an expression, the debugger has to check regularly if the program entered the context into which the expression is defined. thus, it slows execution down drastically. an old expression entered when debugging something else or even another program may have stayed there, so look at the watch window and remove everything.

this advice is also valid for conditional breakpoints.


When using the insert() function with a hint-iterator, then you should make sure it actually is a hint. What happens if you insert items without a hint iterator ?

Sdictionnary.insert(line);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜