从函数返回将进入Visual Studio 2012的无限循环

Returning from a function enters an infinite loop Visual Studio 2012

本文关键字:Studio 2012 无限循环 Visual 函数 返回      更新时间:2023-10-16

我试图测试各种指针速度的速度,但遇到了一个非常奇怪的问题。当为原始指针分配时,它运行良好。(内存泄漏,但这不是问题所在。(当我用shared_ptr运行第二个测试时,它会运行填充,打印日志,然后当它返回时,它进入一个无限循环。看起来ref计数是垃圾,但我做的每件事都是有价值的。

#include <memory>
#include <vector>
#include <functional>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <string>
#include <Windows.h>
using namespace std;
static const int TOTAL = 1000000;
int* newTest(int i)
{
  return new int(i);
}
shared_ptr<int> sharedTest(int i)
{
  return shared_ptr<int>(new int(i));
}
template <typename T>
pair<int, vector<typename T::result_type>> Fill(T fn)
{
  unsigned long start = GetTickCount();
  vector<typename T::result_type> vec;
  vec.reserve(TOTAL);
  for(int i = 0; i < TOTAL; i++)
  {
    vec.push_back(fn(i));
  }
  unsigned long end = GetTickCount();
  return make_pair(end - start, move(vec));
}
template <typename T>
void Test(T fn, string name)
{
  vector<typename T::result_type> newTest;
  int milliseconds = 0;
  tie(milliseconds, newTest) = Fill(fn);
  cout << "Fill " << name << " Took " << milliseconds << " milliseconds." << endl;
}
int main()
{
  function<int*(int)> fn1 = newTest;
  Test(fn1, "Raw Ptr");
  function<shared_ptr<int>(int)> fn2 = sharedTest;
  Test(fn2, "Shared New");
  return 0;
}

好的。看来我问了一个关于堆栈溢出的问题。。。。当我将TOTAL设置为10000时,这很好。那么,这只是其他事情的症状吗?还是我需要增加我的堆栈大小?

从注释编辑:

塔维森:好的,几分钟后就结束了。你说得对,不是一个无限循环。但是,1043毫秒的新时间和许多分钟的删除时间使得很难证明使用它们是合理的。这不是我所期望的结果。

没有无限循环,你只是不耐烦。释放所有shared_ptr需要时间。

为了能够声称存在一个无限循环,您需要实际进入代码并进行查看。检查某个地方是否存在某种循环,其条件永远不会改变。这里的情况并非如此。


例如,降低TOTAL,并验证它是否真的结束了。拥有更多这样的循环不会神奇地在某个数字上引入无限循环,所以如果它在较低的数字上工作,那么它在较高的数字上也工作。

或者,不分配int s;当它被破坏时,分配一些输出"bye"的测试结构(以及一些计数器(,你会看到"post"-测试它们都被删除了。(当然,执行IO会增加销毁时间,但关键是要验证一个条件正在朝着停止循环的方向发展。(

此外,您可以通过使用return make_shared<int>(i);而不是new自己处理int并将其放入shared_ptr来将分配减半。始终使用make_shared

最后,只有当您连接了调试器时,这才是缓慢的,因为它会调试您的内存使用情况。也就是说,验证你删除的内容是否合理,是否损坏了任何东西,等等。

出于对编程的热爱,使用四个空格来缩进,而不是两个空格。

如果您在调试中运行代码或在调试的同时发布代码,您将获得一个可用于跟踪内存错误的调试堆。当这种情况发生时,空闲内存中充满了调试模式,因此代码运行速度会变慢。在不从Visual Studio进行调试的情况下运行代码将在不到200毫秒的时间内结束。