【问题标题】:Memory leak with new and delete新的和删除的内存泄漏
【发布时间】:2013-03-30 05:51:29
【问题描述】:

我试图修改一些以前的代码,但发现程序使用的内存在运行时不断增加。所以可能存在内存泄漏。我的代码的主要部分包含以下循环

CEnergymulti* ener;
double potential;
double pottemp;

potential=0.0;
pottemp=0.0;

for(int i=0;i<nbin;i++)
{
 ener = new CEnergymulti(np1,molfnames1,idiel);
  pottemp=ener->calculatePot(ener->m_mols);
  potential+=pottemp;
 delete ener;
}

其中“CEnergymulti”是一个类。我怀疑重复使用 new 和 delete 可能会导致内存泄漏问题,因为如果我只对循环内的代码执行一次运行,我没有看到运行期间内存增加。如果确实是 new 和 delete 的问题,我该如何纠正?谢谢。

【问题讨论】:

  • 我没有看到内存泄漏。你怎么确定你在泄漏内存?在您的代码上运行类似valgrind 的内容。
  • 也许CEnergymulti 的析构函数没有完全释放它的内存。也许calculatePot 泄漏内存。 Tushar 的建议很棒:valgrind 是一个理想的工具。
  • 在这段特定的代码中,没有内存泄漏,因为您在循环中分配并在循环中解除分配。因此,无论分配的内存在下一次​​迭代之前都被释放。 nneonneo 的权利可能是您需要检查 calculatePort 部分。

标签: c++ memory-leaks


【解决方案1】:

您显示的代码中没有内存泄漏(除非CEnergymulti 的析构函数实现不当)但是没有令人信服的理由来开始使用动态分配的对象。为什么不简单地使用:

CEnergymulti obj;
pottemp=obj.calculatePot(obj.m_mols);
potential+=pottemp;

删除不需要的newdelete,您不必再为手动内存管理而烦恼。

【讨论】:

  • 不能这么肯定!我们看不到所有代码,而且有很多看不见的代码可能会泄漏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
相关资源
最近更新 更多