【发布时间】:2019-01-09 10:00:51
【问题描述】:
我正在尝试调查内存泄漏问题,我发现我的库中的析构函数甚至没有被调用,并且我有以下代码:
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 导致其他析构函数没有被调用吗?
谢谢,
【问题讨论】:
标签: constructor c++-cli destructor