我正在编写一个包含返回\接收接口(interface)的库 shared_ptr
对象。
在我被提醒使用我的库的应用程序可以有不同的 CRT 版本和 STL 版本之前,一切看起来都很美好。
这引出了两个问题:
如果我的 .lib 和使用它的应用程序之间的 STL 版本不同,我如何确保
shared_ptr
的版本相同正在我的库和应用程序中使用? (STL 不提供二进制兼容性)假设我通过复制 STL 的 header 定义
shared_ptr
解决了问题 1并将其重命名为my_shared_ptr
或者现在以任何方式给我相同的shared_ptr
在我的库和应用程序中实现。 由于这是一个模板类,并且 CRT 版本不同,我如何确保new
有匹配的delete
? 如果我的库编译my_shared_ptr<SomeClass>
然后应用程序编译my_shared_ptr<SomeClass>
, 每个编译都有自己的new
和delete
根据 CRT 版本。 现在,当我创建并提交一个shared_ptr
从应用程序到我的库,完成后销毁,不匹配new
和delete
可能会被调用。
我假设 my_shared_ptr<SomeClass>
的两个实例化是否正确?是否要编译,一个由 .lib 编译,一个由应用程序编译?
感谢您的帮助, 狮子座
最佳答案
AFAIK 你不能轻易做到这一点,尽管你可以想象创建一个二进制兼容的共享智能指针类,例如在 Microsoft 平台上使用 COM 对象。您仍然必须确保分配和释放都发生在同一个 DLL 中。这意味着替换智能指针类的“新建”和“删除”将调用从 DLL 导出的函数,保证调用正确的新建和删除实现。
关于c++ - 在具有不同 CRT 的库中使用 shared_ptr<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6760112/