我正在尝试调查内存泄漏问题,但发现我的库中的析构函数甚至没有被调用,并且我有以下代码:
PPCamNET::Native::PpQueue::PpQueue(int capacity) : m_capacity(capacity), m_array(nullptr), m_head(0), m_tail(0)
{
// Quick fix for case when capacity is 1 (single snap)
// and Push function crashes on 1st frame
if (m_capacity == 1)
m_capacity = 2;
m_array = new FrameData[m_capacity];
m_pushes = 0;
m_pops = 0;
}
上面的构造函数的析构函数应在PpQueue被销毁后调用,但不要在断点处停止。
PPCamNET::Native::PpQueue::~PpQueue()
{
delete[] m_array; //<==== here I set a break point
}
PPQueue实例是由AcqCache构造函数创建的。
PPCamNET::Internal::AcqCache::AcqCache(AcqBuffer^ acqBuffer)
{
//m_stopWatchPush = Stopwatch::StartNew();
//m_stopWatchPop = Stopwatch::StartNew();
m_acqBuffer = acqBuffer;
m_cacheLock = gcnew Object();
m_processFrameRunning = true;
try
{
m_frameDataCache = new PpQueue(acqBuffer->BufferSize / 2 + 1);
AcqCache析构函数删除m_frameDataCache,即PpQueue。
PPCamNET::Internal::AcqCache::~AcqCache()
{
m_processFrameRunning = false;
delete m_frameDataCache; // <== here another break point but not called
delete[] m_frameInfoBuffer;
}
最后,Acqusition的构造函数使用gcnew创建一个m_acqCache实例。
PPCamNET::Internal::Acquisition::Acquisition(AcqBuffer^ acqBuffer,
CameraSettings^ camSettings)
{
m_eofEvent = gcnew AutoResetEvent(false);
m_acqCache = gcnew AcqCache(acqBuffer);
我很困惑为什么不调用这些析构函数。这是因为GC没有启动来清理m_acqCache导致未调用其他构造函数吗?
谢谢
答案 0 :(得分:2)
GC不会调用析构函数。 C ++ / CLI编译器将析构函数转换为IDisposable::Dispose()
的实现,并且具有转换为ClassName::!ClassName
的不同语法(Finalize
)。
C#通过为CLR Finalize
函数使用名称“析构函数”,错误地混淆了此问题。终结器不是确定性的。 GC不会自动调用Dispose()
函数。一旦知道发生了什么事就不难了,但是术语肯定会引起混乱。