如何在dll中创建shared_ptr并通过工厂函数导出它
How to create a shared_ptr in dll and export it via a factory function?
我有这段代码:
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中导出Create
和Delete
,以确保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);
相关文章:
- C++接口的工厂函数实现
- 从类模板创建对象的工厂函数模板?
- 定义一个工厂函数,该函数返回指向在此工厂函数中创建的函数的指针
- 重载右值和左值引用的工厂函数 - 高效初始化
- unique_ptr和前向声明:编写工厂函数的正确方法
- 使用自定义删除器返回unique_ptr的工厂函数
- 为什么从工厂函数分配向量并在循环中迭代它会导致段错误
- 将 C 结构工厂函数与其相应的 C++ 包装类构造函数合并
- 返回常量的工厂函数
- 如果没有指针会发生什么情况,获取工厂函数指针
- 工厂函数的最佳智能指针返回类型是什么
- dlclose() 不适用于工厂函数和函数中的复杂静态?
- 带有附加参数的模板工厂函数:友谊问题
- 工厂函数返回元组的C++11模式
- 工厂函数作为类或命名空间中的静态成员
- 从工厂函数返回右值引用时堆/内存损坏
- 如何创建一个工厂函数模板来构造给定任意数量参数的对象
- 如何在工厂函数中解析构造函数签名
- 如何在dll中创建shared_ptr并通过工厂函数导出它
- 没有指针(包括智能指针)或副本的高效工厂函数