从函数返回将进入Visual Studio 2012的无限循环
Returning from a function enters an infinite loop Visual Studio 2012
我试图测试各种指针速度的速度,但遇到了一个非常奇怪的问题。当为原始指针分配时,它运行良好。(内存泄漏,但这不是问题所在。(当我用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毫秒的时间内结束。
- 使用Visual Studio 2012编译时,此代码会给我错误,但是使用代码块就可以了
- 在 Visual Studio 2012 中未命中断点
- C Visual Studio 2012 Express命令窗口怪异行为
- Visual Studio 2012静态图书馆与Visual Studio 2017
- C 11魔术静态在Visual Studio 2012中的解决方法
- 在 Visual Studio 2012 中使用 "= delete" 时出现编译器错误
- Visual Studio (2012) 更改 dll 以导出类和变量
- 资源窗口在其他系统上无法正常工作 (Visual Studio 2012)
- C++函数中的内存泄漏,Visual Studio 2012,链表
- 两个不同的标题GCC,Visual Studio 2012
- gdal201.dll在Visual Studio 2012上的计算机错误中缺少
- Visual Studio 2012中可用覆盖的列表
- Windows 10中的Visual Studio 2012:找不到或打开PDB文件
- 在 64 位 Windows 8 机器上使用 Visual Studio 2012 构建 opencv 的绝对解决方案
- 如何在 Visual Studio 2012 中禁用大括号完成
- 如何在Visual Studio 2012中使用sqlite
- GLFW 链接问题 Visual Studio 2012.
- 使用Visual Studio 2012针对Windows XP构建Boost 1.52库
- 特定于域的语言工具 Visual Studio 2012 输出C++
- 生产力 Microsoft Visual Studio 2012 的电源工具不起作用