如何在dll中创建shared_ptr并通过工厂函数导出它

How to create a shared_ptr in dll and export it via a factory function?

本文关键字:工厂 函数 ptr dll 创建 shared      更新时间:2023-10-16

我有这段代码:

class DLL_API MyClassWrapper
{
private:
    MyClass * m_myClass;
public:
    MyClassWrapper(SIZE inputSize);
    ~MyClassWrapper();
     inline int OutputSize();
}
typedef  std::shared_ptr<MyClassWrapper> MyClassWrapperPtr;
extern "C"
{
     DLL_API MyClassWrapperPtr CreatreMyClassWrapper(SIZE inputSize)
     {
          return std::make_shared<MyClassWrapper>(inputSize);
      }
}

但是它不工作,错误:

Error   1   error C2526: CreatreMyClassWrapper: C linkage function cannot return C++ class 'std::shared_ptr<_Ty>'   

我明白这个问题,但我该如何解决它?

我能看到的选项有:

1-不要传递共享指针。这意味着DLL用户应该在使用指针后删除它。

2-不要使用extern "C":这意味着我必须使用混乱的名称。

还有其他解决方案吗?

开门见山,从C函数返回c++对象-只需通过输出参数返回:

extern "C"
{
     DLL_API void CreatreMyClassWrapper(SIZE inputSize, SomeClass* outputPtr)
     {
          *outputPtr = SomeClass(....);
     }
}

在您的示例中,SomeClass == MyClassWrapperPtr,因此:

extern "C"
{
     DLL_API void CreatreMyClassWrapper(SIZE inputSize, MyClassWrapperPtr* outputPtr)
     {
          *outputPtr = make_shared<MyClassWrapper>(inputSize);
     }
}

考虑稍微改变一下你的接口,因为在目前的情况下,你需要确保你的应用程序和dll使用相同的编译器,链接器,设置,库…*

您可能希望从DLL中导出CreateDelete,以确保DLL中会发生内存管理(这是基于以下答案:

DLL

extern "C"
{
     DLL_API MyClassWrapper* CreateMyClassWrapper(SIZE inputSize)
     {
          return new MyClassWrapper(inputSize);
     }
     DLL_API void DeleteMyClassWrapper(MyClassWrapper* wrapper)
     {
          delete wrapper;
     }
}
<<p> 应用程序/strong>
     shared_ptr<MyClassWrapper> myClassWrapper(CreateMyClassWrapper(inputSize), 
                                               DeleteMyClassWrapper);