假设我将方法std::shared_ptr
中的func
传递给so / dll函数dll_func
,后者又将其推送到私有dll向量中。
然后dll_func
返回,func
也会返回,因此dll向量中的std::shared_ptr
是唯一的std::shared_ptr
实例。
如果稍后在dll上清除向量,那么其中的std::shared_ptr
将被dll或最初创建std::shared_ptr
的调用程序解除分配?
答案 0 :(得分:0)
std::shared_ptr
将被创建时用作删除器的任何函数删除。如果该函数在dll中,则将使用该函数;如果函数在exe中,那么那个。假设您使用默认的delete
,那么标准库运行时::operator delete
将清除它,但它将从dll中的代码中调用(假设未覆盖全局)。
更重要的是,在跨dll边界共享对象时,是否使用相同的编译器和编译器选项?如果是这样,那么它应该按预期工作。如果没有,不要以这种方式共享对象,不能保证二进制兼容性。
为清楚起见;
如果在没有删除器的exe中创建
std::shared_ptr
(因此使用默认值),如果在exe中删除了最后一个实例,则dll将调用从exe调用的相同删除器?
是的,但采用二进制兼容性。