C++指针总结()

在程序运行时分配的内存空间是需要在运行中释放的,这部分内存称之为堆。

智能指针不用自己释放内存,只要没有指针指向内存了,就会自动释放。下面是两种智能指针:

  • shared_ptr允许多个指针指向同一个对象。使用一个计数器记录对象被多少指针指向。无论何时我们拷贝一个shared_ptr,计数器都会递增。例如,当用一个 shared_ ptr 初始化另一个shared_ ptr, 或将它作为参数传递给一个函数以及作为函数的返回值时,它所关联的计数 器就会递增。当我们给shared_ ptr赋予一个新值或是shared_ ptr被销毁(例如一个 局部的shared_ ptr 离开其作用域时),计数器就会递减。 一旦一个shared_ _ptr 的计数器变为0,它就会自动释放自己所管理的对象。
  • unique_ptr则“独占”所指向的对象。
  • 标准库还定义了一个名为weak_ ptr的伴随类,它是一种弱引用,指向shared ptr所管理的对象。这三种类型都定义在memory头文件中。

1. shared_ptr

shared_ptr是一个智能指针支持普通指针的很多操作,如解引用。
shared_ptr是一个类,所以shared_ptr对象肯定有一些可调用的方法,如empty()方法:

*p
#include<iostream>
#include<memory>
#include<string>

int main(int argc, char* argv[]) {
    // 创建一个空string
    std::shared_ptr<std::string> p1 = std::make_shared<std::string>();
    // std::shared_ptr<std::string> p1 = std::make_shared<std::string>(""); // 与上面语句等价
    // auto p1 = std::make_shared<std::string>(""); 
    if(p1 && p1->empty()){
        *p1 = "hello";
        std::cout << *p1 << std::endl;
    }

    return 0;
}
  • p1 && p1->empty()代表p1指向某个对象,且p1所指对象为空。
  • make_shared用于动态分配内存并初始化。常常使用auto定义make_shared生成的结果。

确执行,但会浪费内存。share_ ptr 在无用之后仍然保留的一种可能情况是,你将
shared_ptr存放在一一个容器中,随后重排了容器,从而不再需要某些元素。在这种情况
下,你应该确保用erase删除那些不再需要的shared_ ptr 元素。
什么叫做将shared_ ptr存放在容器中? ? ?
Note
如果你将shared_ ptr存放于一个容器中,而后不再需要全部元素,而只使
用其中一部分,要记得用erase删除不再需要的那些元素。

程序使用动态内存出于以下三种原因之一:
1.程序不知道自己需要使用多少对象
2.程序不知道所需对象的准确类型
3.程序需要在多个对象间共享数据

程序需要在多个对象间共享数据:

————————

在程序运行时分配的内存空间是需要在运行中释放的,这部分内存称之为堆。

智能指针不用自己释放内存,只要没有指针指向内存了,就会自动释放。下面是两种智能指针:

  • shared_ptr允许多个指针指向同一个对象。使用一个计数器记录对象被多少指针指向。无论何时我们拷贝一个shared_ptr,计数器都会递增。例如,当用一个 shared_ ptr 初始化另一个shared_ ptr, 或将它作为参数传递给一个函数以及作为函数的返回值时,它所关联的计数 器就会递增。当我们给shared_ ptr赋予一个新值或是shared_ ptr被销毁(例如一个 局部的shared_ ptr 离开其作用域时),计数器就会递减。 一旦一个shared_ _ptr 的计数器变为0,它就会自动释放自己所管理的对象。
  • unique_ptr则“独占”所指向的对象。
  • 标准库还定义了一个名为weak_ ptr的伴随类,它是一种弱引用,指向shared ptr所管理的对象。这三种类型都定义在memory头文件中。

1. shared_ptr

shared_ptr是一个智能指针支持普通指针的很多操作,如解引用。
shared_ptr是一个类,所以shared_ptr对象肯定有一些可调用的方法,如empty()方法:

*p
#include<iostream>
#include<memory>
#include<string>

int main(int argc, char* argv[]) {
    // 创建一个空string
    std::shared_ptr<std::string> p1 = std::make_shared<std::string>();
    // std::shared_ptr<std::string> p1 = std::make_shared<std::string>(""); // 与上面语句等价
    // auto p1 = std::make_shared<std::string>(""); 
    if(p1 && p1->empty()){
        *p1 = "hello";
        std::cout << *p1 << std::endl;
    }

    return 0;
}
  • p1 && p1->empty()代表p1指向某个对象,且p1所指对象为空。
  • make_shared用于动态分配内存并初始化。常常使用auto定义make_shared生成的结果。

确执行,但会浪费内存。share_ ptr 在无用之后仍然保留的一种可能情况是,你将
shared_ptr存放在一一个容器中,随后重排了容器,从而不再需要某些元素。在这种情况
下,你应该确保用erase删除那些不再需要的shared_ ptr 元素。
什么叫做将shared_ ptr存放在容器中? ? ?
Note
如果你将shared_ ptr存放于一个容器中,而后不再需要全部元素,而只使
用其中一部分,要记得用erase删除不再需要的那些元素。

程序使用动态内存出于以下三种原因之一:
1.程序不知道自己需要使用多少对象
2.程序不知道所需对象的准确类型
3.程序需要在多个对象间共享数据

程序需要在多个对象间共享数据: