【发布时间】:2019-05-20 13:08:21
【问题描述】:
我正在编写 c++ 程序来构造分子并对它们执行矢量运算。为了获得某个特定问题的概率,我必须进行多次随机观察并计算比率。 当我获得 1000 个结果时,我的程序运行良好,但当我获得 10000 个结果时(远远超过 10 倍时间),我的程序几乎永远卡住了。电脑也变得反应迟钝。 因此,为了找出问题所在,经过一些调试后,我得出了以下结论: (我的矢量旋转算法) `
int main()
{
Vector v1(3,4,0);
geom3D::EulerAngle EA(90,0,0);
int K=120000;
for(int i=0;i<K;i++)
{
v1=rotateVector(v1,EA);
if(i%3000==0)
cout << i << "\n";
}
cout << "Done\n";
}
它应该打印 3000,6000 ...我希望它会定期打印,但是,我在这里也遇到了同样的问题: 到了 51000,它打印得很快,然后计算机再次变得无响应。 我的猜测是它与内存分配有关,它在 rotateVector() 中分配了大量内存,但它没有释放,所以我尝试尽可能添加删除语句。但是我仍然找不到一个好的解决方案。 这样的行为正常吗?有解决办法吗?另外,删除语句是我能做的所有事情来释放内存吗?
【问题讨论】:
-
“尽可能地添加删除语句”在我看来绝对是一种“喷洒和祈祷”的方法......当不再需要内存时释放内存,而不是随意释放,并在事后编写清理代码是内存泄漏的秘诀。此外,如果您正在处理数组,为什么要使用原始
new和delete而不是std::vector?最重要的是,鉴于您说问题很可能在rotateVector,您为什么不发布? -
是的,您可能有内存泄漏。要真正解决这个问题(而不是仅仅放入删除语句并希望最好),您通常希望使用 RAII,因此您创建的对象在创建时分配必要的数据,并在销毁时释放它。为了至少更好地了解您是否正在查看内存泄漏,您可能需要观察程序随时间的内存消耗。如果它不断上升,这是泄漏的好兆头(尽管并非所有泄漏都可以通过这种方式轻松观察到)。
-
你需要一台量子计算机...
-
我所说的“我能做到的地方”,是指之后不再需要该对象的地方。不过感谢您的指点。会进去看看
-
假设您的算法(或内存泄漏)不会导致您的计算机耗尽 RAM 并开始交换(这肯定会大大减慢速度),另一种解释是您正在运行一种具有大于线性缩放行为的算法。尤其是 O(N^2) 算法,因其在小问题规模上表现良好而臭名昭著,然后随着问题规模变大而迅速恶化为难以处理的问题。你应该在分析器下运行你的程序,看看它把时间花在了哪里,然后看看你是否可以重写该算法以提高效率。