当前位置:网站首页>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_ptrwhen , If the object it points to has been replaced by anothershared_ptrTo 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 .
边栏推荐
- Service fusing hystrix
- Haut OJ 1347: addition of choice -- high progress addition
- YOLOv5-Shufflenetv2
- To the distance we have been looking for -- film review of "flying house journey"
- Gbase database helps the development of digital finance in the Bay Area
- AtCoder Grand Contest 013 E - Placing Squares
- 26、 File system API (device sharing between applications; directory and file API)
- kubeadm系列-01-preflight究竟有多少check
- Codeforces Round #716 (Div. 2) D. Cut and Stick
- 挂起等待锁 vs 自旋锁(两者的使用场合)
猜你喜欢
随机推荐
26、 File system API (device sharing between applications; directory and file API)
Codeforces Round #732 (Div. 2) D. AquaMoon and Chess
SAP-修改系统表数据的方法
Codeforces round 712 (Div. 2) d. 3-coloring (construction)
【Jailhouse 文章】Performance measurements for hypervisors on embedded ARM processors
To be continued] [UE4 notes] L4 object editing
SSH password free login settings and use scripts to SSH login and execute instructions
Sword finger offer 05 Replace spaces
Detailed explanation of expression (csp-j 2021 expr) topic
浅谈JVM(面试常考)
Configuration and startup of kubedm series-02-kubelet
[speed pointer] 142 circular linked list II
Light a light with stm32
The number of enclaves
How can the Solon framework easily obtain the response time of each request?
MySQL数据库(一)
利用HashMap实现简单缓存
Haut OJ 1347: addition of choice -- high progress addition
Haut OJ 1221: a tired day
[merge array] 88 merge two ordered arrays





![[article de jailhouse] jailhouse hypervisor](/img/f4/4809b236067d3007fa5835bbfe5f48.png)



