2

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

#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;
}

好的。看来我在 Stackoverflow 上问了一个堆栈溢出问题......当我将 TOTAL 设置为 10000 时,这很好。那么,这只是其他问题的症状还是我需要增加我的筹码量?

从评论编辑:

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

4

2 回答 2

6

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

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


TOTAL例如,降低你的 ,并验证它实际上结束了。拥有更多这些不会神奇地在某个数字上引入无限循环,因此如果它以较低的数字工作,它会以较高的数字工作。

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

此外,您可以通过使用return make_shared<int>(i);而不是new自己使用 int 并将其放入shared_ptr. 始终使用make_shared.

最后,如果您连接了调试器,这只会很慢,因为它会调试您的内存使用情况。也就是说,验证您要删除的内容是否可以删除,不会破坏任何内容等。

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

于 2013-03-29T20:01:46.190 回答
4

If you run the code in debug or release with debugging, you'll get a debug heap that can be used to track memory errors. Freed memory is filled with debug patterns when this happens, so the code will run slower. Running the code without debugging from Visual Studio ends in less than 200 milliseconds.

于 2013-03-29T20:13:57.987 回答