多重内存泄漏 - 向量和指针
Multiple Memory Leaks - Vector and Pointer
我的应用程序一直存在内存泄漏问题,因为它在物理模块(几乎所有东西都使用)中,它导致应用程序速度大幅下降。通过使用 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; 之外的所有变量。并且构造函数的内存泄漏仍然发生,另外我要注意的是我正在释放 class 的析构函数中指针的内存,尽管我不确定这是否是最好的地方它。
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::~ParticleModel()
{
delete _transform;
}
但是,构造函数不是分配此对象的地方。它被传递到构造函数中,并设置为 class 成员。内存泄漏的一个可能原因是存在分配此对象的新实例的代码路径,但不会存储在任何地方,或传递给 ParticleModel
的新实例,因此永远不会获取销毁。
这违反了RAII model。
此外,这个 class 可能 violates the Rule Of Three,这可能是内存泄漏的另一个来源。即使这个动态作用域的对象总是被传递给构造函数,如果不正确地遵循三规则,内存泄漏仍然可能发生;与可能的内存损坏配对,作为额外的奖励。
构造函数中似乎没有任何其他内容分配任何内存,并且可能会泄漏任何内容。试图定位内存泄漏源的工具并不总是可靠的,它们的输出有时难以理解。
最好遵循既定的设计原则,正确地设计你的 classes,而不是风起云涌全速前进,并依靠调试工具来发现和解决任何问题结果。
为了能够验证不可能存在任何内存泄漏,RAII
原则规定必须在构造函数中分配动态作用域对象或任何类型的任何资源,并在析构函数中销毁(赋值运算符正确处理该过程,以遵守三规则)。如果您无法追踪内存泄漏的实际来源,通过适当地重新设计 classes,您可能最终会修复潜在的错误。
如果是指针向量,则必须显式删除。检查这个 post,它可能对你有帮助..
Does vector::erase() on a vector of object pointers destroy the object itself?
同样在 ParticleModel 中,您注释掉了构造函数并尝试删除 _transform
... 呃,这样可以达到目的吗? :) ..我想问题出在构造函数调用上,请post详细代码..
我的应用程序一直存在内存泄漏问题,因为它在物理模块(几乎所有东西都使用)中,它导致应用程序速度大幅下降。通过使用 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; 之外的所有变量。并且构造函数的内存泄漏仍然发生,另外我要注意的是我正在释放 class 的析构函数中指针的内存,尽管我不确定这是否是最好的地方它。
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::~ParticleModel()
{
delete _transform;
}
但是,构造函数不是分配此对象的地方。它被传递到构造函数中,并设置为 class 成员。内存泄漏的一个可能原因是存在分配此对象的新实例的代码路径,但不会存储在任何地方,或传递给 ParticleModel
的新实例,因此永远不会获取销毁。
这违反了RAII model。
此外,这个 class 可能 violates the Rule Of Three,这可能是内存泄漏的另一个来源。即使这个动态作用域的对象总是被传递给构造函数,如果不正确地遵循三规则,内存泄漏仍然可能发生;与可能的内存损坏配对,作为额外的奖励。
构造函数中似乎没有任何其他内容分配任何内存,并且可能会泄漏任何内容。试图定位内存泄漏源的工具并不总是可靠的,它们的输出有时难以理解。
最好遵循既定的设计原则,正确地设计你的 classes,而不是风起云涌全速前进,并依靠调试工具来发现和解决任何问题结果。
为了能够验证不可能存在任何内存泄漏,RAII
原则规定必须在构造函数中分配动态作用域对象或任何类型的任何资源,并在析构函数中销毁(赋值运算符正确处理该过程,以遵守三规则)。如果您无法追踪内存泄漏的实际来源,通过适当地重新设计 classes,您可能最终会修复潜在的错误。
如果是指针向量,则必须显式删除。检查这个 post,它可能对你有帮助.. Does vector::erase() on a vector of object pointers destroy the object itself?
同样在 ParticleModel 中,您注释掉了构造函数并尝试删除 _transform
... 呃,这样可以达到目的吗? :) ..我想问题出在构造函数调用上,请post详细代码..