初步认识
原文链接:https://blog.csdn.net/flowing_wind/java/article/details/81301001
参考资料:《C++ Primer中文版 第五版》
我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。
在C++中,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。
动态内存管理经常会出现两种问题:一种是忘记释放内存,会造成内存泄漏;一种是尚有指针引用内存的情况下就释放了它,就会产生引用非法内存的指针。
为了更加容易(更加安全)的使用动态内存,引入了智能指针的概念。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。
标准库提供的两种智能指针,区别在于管理底层指针的方法不同,
- shared_ptr允许多个指针指向同一个对象,
- unique_ptr则“独占”所指向的对象。
- 标准库还定义了一种名为weak_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象,这三种智能指针都定义在memory头文件中。
Ref: C++中的智能指针
自C语言以来,指针就是一个重要却又充满了麻烦的特性。使用指针的一个理由是在作用域以外使用引用语义。但是,指针的生命期和所指对象的生命期的确认是十分恼人的一件事情,尤其是多个指针指向同一个对象。例如,为了在多个集合中拥有同一个对象,必须要给每个集合传入指针。在理想的情况下,其中一个指针被销毁了,没有任何问题会发生(即没有空悬指针,也不会重复删除被引用的对象),当指向对象的最后一个指针被销毁时,该对象才会被销毁(即没有资源泄漏)。
为了避免各种问题,一种通用的解决方案是使用智能指针。智能指针之所以智能是因为它们可以支持程序员来避免上述的问题。例如,智能指针可以 智能地知道 它是不是最后一个指向对象的指针,并且据此可以实现由对象的最后一个指针来决定对象的销毁。
但是仅仅只有一种智能指针是不足够的。智能指针针对各种情况是十分智能的,但会导致其他方面的延时,因为要为智能付出代价。即便使用智能指针,也会存在误用和产生错误的情况。
生命周期
一、变量de底层原理
构建、析构
#include <iostream> #include <stack> #include <memory> using namespace std; struct X { X() { cout << "X() ";} ~X() { cout << "~X() ";} }; struct Y { Y() { cout << "Y() ";} ~Y() { cout << "~Y() ";} }; class A { X x; public: A() { cout << "A() ";} ~A() { cout << "~A() ";} }; class B: public A { Y y; public: B() { cout << "B() ";} ~B() { cout << "~B() ";} }; class S { public: S() { cout << "S() ";} ~S() { cout << "~S() ";} }; ///////////////////////////////////////////////////////////// int main() { cout << "Hello World!" << endl; #if 1 B b; #else A a; { cout << "1" << endl; A &s = a; cout << "2" << endl; } cout << "3" << endl; #endif return 0; }