不调用C ++ / Cli析构函数

时间:2018-08-01 18:21:44

标签: constructor c++-cli destructor

我正在尝试调查内存泄漏问题,但发现我的库中的析构函数甚至没有被调用,并且我有以下代码:

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导致未调用其他构造函数吗?

谢谢

1 个答案:

答案 0 :(得分:2)

GC不会调用析构函数。 C ++ / CLI编译器将析构函数转换为IDisposable::Dispose()的实现,并且具有转换为ClassName::!ClassName的不同语法(Finalize)。

C#通过为CLR Finalize函数使用名称“析构函数”,错误地混淆了此问题。终结器不是确定性的。 GC不会自动调用Dispose()函数。一旦知道发生了什么事就不难了,但是术语肯定会引起混乱。