当前位置:网站首页>shared_ Repeated release heap object of PTR hidden danger
shared_ Repeated release heap object of PTR hidden danger
2022-07-05 05:34:00 【Raise items】
It was thought that smart pointers could completely ensure the correct reference and release of heap objects , But smart pointers are not omnipotent . With shared_ptr
For example , The following usage cases will make the code repeatedly release heap objects .
1. Abuse of primitive pointer construction shared_ptr
#include <iostream>
#include <memory>
class A {
};
using Ptr = std::shared_ptr<A>;
int main()
{
A *ps = new A();
Ptr p1(ps);
Ptr p2(p1);
Ptr p3 = p2;
Ptr p4;
p4 = p3;
Ptr p5(ps);
std::cout << p1.use_count() << std::endl;
std::cout << p2.use_count() << std::endl;
std::cout << p3.use_count() << std::endl;
std::cout << p4.use_count() << std::endl;
std::cout << p5.use_count() << std::endl;
return 0;
}
The operation results are as follows :
You can see , In the use of Copy structure Or assignment operator =
When ,shared_ptr
The control block will be shared and updated . And when you use Primitive pointer construction A new shared_ptr
when , A new control block will be created and initialized .
So at the end of the program , When shared_ptr
When you want to parse the heap object you point to , Memory will be released repeatedly , This causes runtime errors .
structure
shared_ptr
when , If the object it points to has been replaced by anothershared_ptr
To refer to , Please initialize the new pointer with copy construction or assignment .
2. The class contains... That points to itself shared_ptr
#include <iostream>
#include <memory>
class A;
using SPtr = std::shared_ptr<A>;
using WPtr = std::weak_ptr<A>;
class A {
public:
A() : sptr(this), wptr(sptr)
{
std::cout << "in construct :" << std::endl;
std::cout << sptr.use_count() << std::endl;
std::cout << this << " " << sptr << " " << wptr.lock() << std::endl;
}
private:
SPtr sptr;
WPtr wptr;
};
int main()
{
A *p = new A();
SPtr ptr(p);
std::cout << "in main :" << std::endl;
std::cout << ptr.use_count() << std::endl;
return 0;
}
The operation results are as follows :
The reason is similar to the above , A heap object By Two shared_ptr
Control block management , Eventually, memory is repeatedly released .
If main The function is like this , There will also be running errors . The reason is when the object is delete
When released , Object shared_ptr
Also released , At this time, the object it points to (this
) Will be released again .
int main()
{
A *p = new A();
std::cout << p << std::endl;
delete p;
return 0;
}
Please don't use this wonderful usage .
边栏推荐
- 从Dijkstra的图灵奖演讲论科技创业者特点
- 常见的最优化方法
- 2017 USP Try-outs C. Coprimes
- 全国中职网络安全B模块之国赛题远程代码执行渗透测试 //PHPstudy的后门漏洞分析
- Haut OJ 1350: choice sends candy
- SAP method of modifying system table data
- [to be continued] [depth first search] 547 Number of provinces
- Gbase database helps the development of digital finance in the Bay Area
- Maximum number of "balloons"
- Solution to the palindrome string (Luogu p5041 haoi2009)
猜你喜欢
sync. Interpretation of mutex source code
Little known skills of Task Manager
CF1637E Best Pair
剑指 Offer 04. 二维数组中的查找
Palindrome (csp-s-2021-palin) solution
Yolov5 ajouter un mécanisme d'attention
剑指 Offer 05. 替换空格
Sword finger offer 58 - ii Rotate string left
【Jailhouse 文章】Jailhouse Hypervisor
Gbase database helps the development of digital finance in the Bay Area
随机推荐
Zzulioj 1673: b: clever characters???
How many checks does kubedm series-01-preflight have
Fried chicken nuggets and fifa22
PC寄存器
YOLOv5添加注意力機制
Sword finger offer 09 Implementing queues with two stacks
利用HashMap实现简单缓存
How can the Solon framework easily obtain the response time of each request?
【Jailhouse 文章】Performance measurements for hypervisors on embedded ARM processors
Codeforces round 712 (Div. 2) d. 3-coloring (construction)
Animation scoring data analysis and visualization and it industry recruitment data analysis and visualization
卷积神经网络——卷积层
数仓项目的集群脚本
Time complexity and space complexity
Solution to the palindrome string (Luogu p5041 haoi2009)
剑指 Offer 05. 替换空格
[merge array] 88 merge two ordered arrays
CF1634 F. Fibonacci Additions
2017 USP Try-outs C. Coprimes
Sword finger offer 05 Replace spaces