晓说智能指针shared_ptr为何可以实现跨模块分配和释放内存

本文探讨了在C++中,当使用`std::shared_ptr`在DLL和EXE之间传递对象时,如何避免内存管理问题。通过分析`shared_ptr`的源码和虚函数机制,揭示了`shared_ptr`在析构时如何确保正确调用DLL中分配内存的`delete`操作,从而实现跨模块的内存释放。关键在于`_Ref_count`基类的虚函数`_destroy()`,在`reset`过程中,通过`swap`保证了引用计数器对象与调用模块的一致性。
摘要由CSDN通过智能技术生成

最近做项目, 有个地方是外包人员写的, 其中有个函数,大致这样

void getInfo(std::shared_ptr<Info>& outInfo); 这个函数是一个dll(链接静态vc库, 使用/MT链接选项)。

我在exe(也是/MT选项)中使用这个函数, 一开始看了,感觉危险,为啥呢?因为我是这样调用的

f()

{

   std::shared_ptr<Info> tmpInfo;

  getInfo(tmpInfo);

}

所以,内存是在dll里面分配的,但是 内存在f退出时,析构 tmpInfo, 肯定会有释放的动作,这岂不是 dll分配  , exe释放吗?而且还是静态链接, 必然会 堆冲突啊, 然而无论我怎么测试 , 就是好的出奇, 没有任何挂掉的迹象。 我想了好几天, 也跟了好几次std::shared_ptr的代码, 明明最后看到有 delete p这样的类似语句, 那么delete不是释放了不该管的内存吗&#x

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值