【问题标题】:C++/Cli Destructors are not called不调用 C++/Cli 析构函数
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 所以在 C++/CLI 中我们不使用 ClassName::~ClassName ,但必须使用 lassName::!ClassName ?我们什么时候使用 ClassName::~ClassName ?
    • @user1296153:这里已经提出并回答了(现在我给了你罗塞塔石碑,这样你就可以在 C++/CLI 语言和 .NET 运行时语言之间进行转换):stackoverflow.com/questions/732864/finalize-vs-dispose
    猜你喜欢
    • 2014-02-26
    • 2019-11-09
    • 2023-03-31
    • 2013-06-02
    • 1970-01-01
    • 2020-06-20
    • 2011-04-04
    • 2014-05-03
    • 2021-07-19
    相关资源
    最近更新 更多