10. 第 10 章 指针

1. 内存的每一个字节都有一个地址,变量的地址是首字节的地址。(比如一个 int 类型有 4 个字节,但是将第一个字节的地址作为整个变量的地址)

2. 数组名是一个常量指针。

3. 用 nullptr 来指示一个无效的内存地址。

4. 给函数传递指针,与传递引用可以起到相同的效果。但是引用比指针更容易处理,因为它隐藏了所有的解引用和间接引用机制。在处理 c 字符串时,最好使用指针。

5. 指向 const 的指针作形参,既能接收常量实参的地址,也可以接收非常量实参的地址。(指向 const 的指针可以理解为指向常量数据的指针,指针指向的数据不能改变,但是指针本身可以改变。而 const 指针的意思        是, 指针本身是一个常量,被初始化之后,指针本身的值不能改变)

6. 动态内存分配只能通过指针来实现,它可以允许程序根据需要临时创建变量(通过 new 运算符来完成,更多的是用它创建一个动态数组)。

7. 使用 new 时,会从堆中分配内存,使用完毕后,应该使用 delete 来释放内存,否则会出现内存泄漏。在对指针调用 delete 之后,应该立刻给指针赋值为 nullptr , 表明该指针不再指向一个有效的内存。

8. 避免悬空指针的方法:(1)在释放内存后,立刻将指针的值设置为 nullptr。(2)在试图访问指针的值之前,先判断指针是否为空。 

9. 函数可以返回一个指向动态分配存储区域的指针,而不应该返回一个局部变量的指针。

10. 需要动态分配内存的类应该在它的构造函数中调用 new ,并在析构函数中调用 delete。

11. 引入智能指针来解决悬空指针,内存泄漏,双重删除等问题。智能指针有 unique_ptr , shared_ptr , weak_ptr三种类型。智能指针的核心思想是动态分配内存的所有权问题。

12.  unique_ptr<int>表示一个指向 int 的独占指针。独占指针表示对象与指针是一一对应的关系,当它离开作用域或者要指向别的对象时,就会自动释放自己所管理的对象。可使用 move()函数,将对象的所有权从一个独占指针转移到另一个独占指针。正因为如此,在传递参数时,需要使用move()函数来转移所有权(将实参按照值传递给形参,会造成两个指针指向一个对象,这样会违反独占原则,而通过引用传递就不会)

13. 在 c++ 14中,可以使用 make_unique<T>() 来返回一个对象,同理,也可以使用 make_shared<T>()。

14.  共享指针用于管理可以由多个智能指针共同拥有的动态分配的对象。在使用共享指针时,应该避免两个指针组管理相同对象的情况。

15. 使用 make_shared<T> 不仅高效,也可以避免双重管理的发生。

 

posted @ 2020-01-25 23:04  Hello_Nolan  阅读(81)  评论(0编辑  收藏  举报