【发布时间】:2016-07-20 10:47:57
【问题描述】:
我的应用程序一直存在内存泄漏问题,并且由于它位于物理模块中(几乎所有东西都使用它),因此导致应用程序运行缓慢。通过使用 Visual Leak Detector,我发现大多数泄漏是由于构造函数和 ApplyGravity 函数而发生的。
ParticleModel::ParticleModel(Transform* transform)
{
_transform = transform;
Acceleration = XMFLOAT3(0.0f, 0.0f, -0.1f);
mass = 10.0f;
force = XMFLOAT3(0.0f, 0.0f, 0.0f);
velocity = XMFLOAT3(0.0f, 0.0f, 0.0f);
netForce = XMFLOAT3(0.0f, 0.0f, 0.0f);
forceMag = 0.0f;
sForce = XMFLOAT3(0.0f, 0.0f, 0.0f);
dragFactor = 1.0f;
gravity = -9.81f;
_usingGravity = false;
_useConstAcc = true;
laminar = true;
radius = 0.5f;
CollisionCheck = false;
boolsForce = true;
move.x = 0.0f;
move.y = 0.0f;
move.z = 0.0f;
moveBy = 0.0f;
}
我注释掉了除了 _transform = transform; 之外的所有变量。并且构造函数的内存泄漏仍然发生,另外我要注意的是,我正在释放类的析构函数中指针的内存,尽管我不确定这是否是最好的地方。
ParticleModel::~ParticleModel()
{
delete _transform;
}
ApplyGravity 中的第二次内存泄漏:
void ParticleModel::ApplyGravity()
{
_temp = XMFLOAT3(0.0f, gravity, 0.0f);
_forces.push_back(_temp); //_forces is a vector of XMFLOAT3s
}
我玩过清除矢量,但无济于事,因为泄漏仍然发生。
输出:
Leak Hash: 0x5522F309, Count: 1, Total 12 bytes
Call Stack (TID 1556):
MSVCR120D.dll!operator new()
c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0 (848): DX11 Framework.exe!std::_Wrap_alloc<std::allocator<DirectX::XMFLOAT3> >::allocate()
c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector (1588): DX11 Framework.exe!std::vector<DirectX::XMFLOAT3,std::allocator<DirectX::XMFLOAT3> >::_Reallocate() + 0x17 bytes
c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector (1619): DX11 Framework.exe!std::vector<DirectX::XMFLOAT3,std::allocator<DirectX::XMFLOAT3> >::_Reserve()
c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector (1258): DX11 Framework.exe!std::vector<DirectX::XMFLOAT3,std::allocator<DirectX::XMFLOAT3> >::push_back()
particlemodel.cpp (58): DX11 Framework.exe!ParticleModel::ApplyGravity()
particlemodel.cpp (290): DX11 Framework.exe!ParticleModel::Update()
gameobject.cpp (27): DX11 Framework.exe!GameObject::Update() + 0x1F bytes
bbparticle.cpp (193): DX11 Framework.exe!BBParticle::Update()
smokeemitter.cpp (54): DX11 Framework.exe!SmokeEmitter::Update()
application.cpp (1254): DX11 Framework.exe!Application::Update() + 0x30 bytes
main.cpp (67): DX11 Framework.exe!wWinMain()
f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c (466): DX11 Framework.exe!wWinMainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
ntdll.dll!RtlUnicodeStringToInteger() + 0x253 bytes
ntdll.dll!RtlUnicodeStringToInteger() + 0x21E bytes
Data:
00 00 00 00 C3 F5 1C 41 00 00 00 00 .......A ........
我认为发生的所有其他泄漏都是由于在输出中列出的所有位置调用了 ParticleModel。例如 ParticleModel::Update() 调用 ApplyGravity 等等。
【问题讨论】:
-
您是动态创建
ParticleModel吗?每个new都有一个delete吗? -
ParticleModel的用户定义复制构造函数和赋值运算符在哪里?