0

我最近遇到了一个内存问题,我对此很陌生,所以希望有人能给我一些指示。


  • 内存:8G
  • 处理器:i7

弹出窗口显示

ParticleSystemJames.exe 中 0x759fc41f 处的未处理异常:Microsoft C++ 异常:内存位置 0x0017ec78 处的 std::bad_alloc..


VS2010 调试模式下的堆栈跟踪:

KernelBase.dll!759fc41f()   
[Frames below may be incorrect and/or missing, no symbols loaded for KernelBase.dll]    
KernelBase.dll!759fc41f()   
msvcr100d.dll!_unlock(int locknum)  Line 375    C
msvcr100d.dll!_unlockexit()  Line 785 + 0x7 bytes   C
msvcr100d.dll!_CxxThrowException(void * pExceptionObject, const _s__ThrowInfo * pThrowInfo)  Line 157   C++
msvcr100d.dll!operator new(unsigned int size)  Line 64  C++
ParticleSystemJames.exe!std::_Allocate<SpringLink *>(unsigned int _Count, SpringLink * * __formal)  Line 36 + 0x15 bytes    C++
ParticleSystemJames.exe!std::allocator<SpringLink *>::allocate(unsigned int _Count)  Line 187 + 0xb bytes   C++
ParticleSystemJames.exe!std::deque<SpringLink,std::allocator<SpringLink> >::_Growmap(unsigned int _Count)  Line 1599 + 0x15 bytes   C++
ParticleSystemJames.exe!std::deque<SpringLink,std::allocator<SpringLink> >::push_back(const SpringLink & _Val)  Line 1265 + 0x34 bytes  C++>    
ParticleSystemJames.exe!ParticleSystem::createLink(Particle * p1_ptr, Particle * p2_ptr, _Material material)  Line 128  C++
ParticleSystemJames.exe!createVoxel(int p_x_idx, int p_y_idx, int p_z_idx, _Material p_material, double p_voxelEdgeLen)  Line 358   C++
ParticleSystemJames.exe!addPoints()  Line 226 + 0x4f bytes  C++
ParticleSystemJames.exe!runSimulation()  Line 654   C++
ParticleSystemJames.exe!main(int argc, char * * argv)  Line 708 C++
ParticleSystemJames.exe!__tmainCRTStartup()  Line 555 + 0x19 bytes  C
ParticleSystemJames.exe!mainCRTStartup()  Line 371  C
kernel32.dll!752133aa()     
ntdll.dll!776d9ef2()    
ntdll.dll!776d9ec5()    

代码(下面的 L 是一个 std::deque (有很好的理由不是向量),下面的函数将被重复调用超过 200,000 次):

SpringLink* ParticleSystem::createLink(Particle* p1_ptr, 
Particle* p2_ptr, Material material)
{

bool isDirectlyLinked = this->isDirectNeighor(*p1_ptr, *p2_ptr);

// Create the Spring Link
SpringLink* springLinkPtr = new SpringLink(p1_ptr->getIdx(), p2_ptr->getIdx());     
springLinkPtr->addMaterial(material);
springLinkPtr->isDiagonal = !isDirectlyLinked; 
L.push_back(*springLinkPtr);
int linkIdx = L.size()-1;
L[linkIdx].setIdx(linkIdx);

// Fill in the 'neighorhood' info  
p1_ptr->addNeigParticleIdx(p2_ptr->getIdx(), linkIdx);
p2_ptr->addNeigParticleIdx(p1_ptr->getIdx(), linkIdx);

// Create the link display - for drawing only
SpringLinkDisplay* springForcePtr = new SpringLinkDisplay(p1_ptr, p2_ptr);
//springForcePtr->k = springLinkPtr->k;
// For drawing different material using differet colors
springForcePtr->set_colorRGBA(springLinkPtr->get_colorRGBA());
// For drawing diagonal link using differet colors
springForcePtr->isDiagonal = !isDirectlyLinked; 
S.push_back(*springForcePtr);
int forceIdx = S.size()-1;
S[forceIdx].setIdx(forceIdx);

return &(L[linkIdx]);

}

问题:

  • VS2010 Ultimate 中有没有一种方法可以非常方便地监控堆使用情况而无需运行分析?
  • 我在Debug -> Windows -> Memory下打开了4个窗口,但不知道我们如何在这里使用它来帮助定位这种备忘录访问冲突,有人有什么想法吗?
  • 有没有其他适用于 Win 7 的实用的免费堆/备忘录监视器可以帮助解决这种情况?

编辑:

我刚刚在我的任务管理器监视器中发现了一些有趣的东西

--物理内存(MB)--

总计 8183

缓存 2599

可用 2544

免费 4

--内核内存(MB)--

第 274 页

非分页 250

- 问题: -

  • 但是,Available 不是唯一重要的数字吗?
  • 因此,当我的应用程序运行时,即使我的“免费”数字也减少到接近于零,但这只是用于“前端加载”库而不是我的异常的原因,不是吗?
  • 如果是导致问题的“免费”部分,除了显着优化我的代码之外,解决此问题的最佳方法是什么?
4

0 回答 0