当前位置:网站首页>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 .
边栏推荐
- [sum of two numbers] 169 sum of two numbers II - enter an ordered array
- Reflection summary of Haut OJ freshmen on Wednesday
- Haut OJ 2021 freshmen week II reflection summary
- Sword finger offer 53 - I. find the number I in the sorted array
- Add level control and logger level control of Solon logging plug-in
- In this indifferent world, light crying
- Solution to the palindrome string (Luogu p5041 haoi2009)
- Control Unit 控制部件
- 剑指 Offer 05. 替换空格
- [interval problem] 435 Non overlapping interval
猜你喜欢
Light a light with stm32
剑指 Offer 04. 二维数组中的查找
[to be continued] [UE4 notes] L1 create and configure items
[to be continued] [UE4 notes] L3 import resources and project migration
EOJ 2021.10 E. XOR tree
On-off and on-off of quality system construction
YOLOv5添加注意力機制
读者写者模型
Chapter 6 data flow modeling - after class exercises
Sword finger offer 35 Replication of complex linked list
随机推荐
lxml.etree.XMLSyntaxError: Opening and ending tag mismatch: meta line 6 and head, line 8, column 8
[to be continued] [depth first search] 547 Number of provinces
Sword finger offer 58 - ii Rotate string left
搭建完数据库和网站后.打开app测试时候显示服务器正在维护.
[allocation problem] 135 Distribute candy
Haut OJ 1347: addition of choice -- high progress addition
Haut OJ 2021 freshmen week II reflection summary
使用Electron开发桌面应用
Configuration and startup of kubedm series-02-kubelet
High precision subtraction
Introduction to memory layout of FVP and Juno platforms
Mysql database (I)
sync. Interpretation of mutex source code
Csp-j-2020-excellent split multiple solutions
ALU逻辑运算单元
Add level control and logger level control of Solon logging plug-in
F - Two Exam(AtCoder Beginner Contest 238)
kubeadm系列-00-overview
Haut OJ 1350: choice sends candy
PC寄存器