(更好的替代方法)将std :: shared_ptr从C ++ DLL传递给C ++ / CLI DLL

时间:2018-03-25 22:43:18

标签: c++ c++-cli smart-pointers

这是我之前的问题here的延续。一点介绍:

“我正在开发一个包含两层,非托管(C ++)和托管(C ++ / CLI)的库。非托管层包含逻辑和计算算法,而托管层为.NET提供接口和可视化。托管层中的类将其类对应物包装在非托管层中,例如,ManagedA包装UnmanagedA,ManagedB包装UnmanagedB。“

为清楚起见,这两个层是作为单独的DLL实现的。

在上一篇文章中,我询问了如何在多个托管对象中包装相同的非托管对象,这可以使用std :: shared_ptr来完成。但是,我写的解决方案(下面的代码段)基于对原始问题的回复,有一个带有shared_ptr参数的构造函数,它假定C ++ DLL传递了一个std :: shared_ptr实例。

我的问题是:是否建议在不同的DLL之间传递std :: shared_ptr?评论员here不建议这样做是因为潜在的兼容性问题。然而,这是写于2009年,所以我想知道是否有新的论据赞成这样做。

编辑详细说明:下一个问题是,如果不推荐,可以选择什么?问题是,如果UnmanagedA :: B()返回一个原始指针,ManagedB会将其视为尚未共享的新实例。因此,当两个ManagedB实例中的一个超出范围时,将删除UnmanagedB实例,这会使另一个ManagedB实例中的指针无效。 非常感谢。

// Unmanaged classes in a C++ DLL

class UnmanagedB
{
public:
    UnmanagedB() {}
    ~UnmanagedB() {}

    int i = 0;
};

class UnmanagedA
{
public:
    UnmanagedA(UnmanagedB* pUnmanagedB)
    : m_pUnmanagedB(pUnmanagedB)
    {
    }

    ~UnmanagedA() {}

    std::shared_ptr<UnmanagedB> B() { return m_pUnmanagedB; }

protected:
    std::shared_ptr<UnmanagedB> m_pUnmanagedB;
};

// Managed classes in a C++/CLI DLL
public ref class ManagedA : IDisposable
{
public:
    ManagedA(UnmanagedA* pUnmanagedA)
        : m_pUnmanagedA(pUnmanagedA)
    {

    }

    ~ManagedA()
    {
        delete m_pUnmanagedA;
    }

    ManagedB^ B()
    {
        return gcnew ManagedB(m_pUnmanagedA->B());
    }

private:
    UnmanagedA* m_pUnmanagedA;
};

public ref class ManagedB : IDisposable
{
public:
    ManagedB(const std::shared_ptr<UnmanagedB>& rkUnmanagedB)
        : m_pUnmanagedB(new std::shared_ptr<UnmanagedB>(rkUnmanagedB))
    {
    }

    ~ManagedB()
    {
        delete m_pUnmanagedB;
    }

private:
    std::shared_ptr<UnmanagedB>* m_pUnmanagedB;
    std::shared_ptr<UnmanagedB> GetPtr() { return *m_pUnmanagedB; }
};

0 个答案:

没有答案