zoukankan      html  css  js  c++  java
  • 《C++ primer 第五版》读书笔记

    《C++ primer 第五版》 读书笔记
    一、动态内存与智能指针
    1、shared_ptr自动销毁所管理的对象。
    shared_ptr的析构函数会递减它所指向的对象的引用计数。如果引用计数变为0,shared_ptr的析构函数就会销毁对象,并释放它占用的内存。
    2、shared_ptr会自动释放相关联的内存。
    拷贝一个 shared_ptr会增加所管理对象的引用计数值。将一个shared_ptr赋予另一个shared_ptr会递增赋值号右侧shared_ptr的引用计数,而递减左侧的shared_ptr的引用计数。
    returnable返回一个 shared_ptr会增加所管理对象的引用计数值。
    局部shared_ptr在离开作用域时会减少对象的引用计数值。
    3、由于在最后一个shared_ptr销毁前内存都不会释放,保证shared_ptr在无用之后不再保留就非常重要了。如果你忘记了销毁不再需要的shared_ptr,程序ren然会正确执行,但会浪费内存。
    shared_ptr在无用之后ren然保留的一种可能情况是,你将shared_ptr存放在一个容器中,随后重排了容器,从而不再需要某些元素。在这种情况下,你应该确保用erase删除那些不再需要的shared_ptr元素。

    4、动态生存期资源的三种使用情况:
    1)程序不知道自己需要使用多少对象;
    2)程序不知道所需对象的准确类型;
    3)程序需要在多个对象间共享数据;

    5、使用动态内存的一个常见原因是允许多个对象共享相同的状态(底层数据)。这时,当某个对象被销毁时,不能单方面的销毁底层数据。
    6、实现一个新的集合类型的最简单方法是使用某个标准库容器来管理元素。
    7、!!!在练习StrBlob类共享底层数据时,写的一个函数,报如下警告:
    function 'test_strBlob' could be declared with attribute 'noreturn' xxbs::???

    8、throw std::out_of_range真好用
    void StrBlob::check(StrBlob::size_type i, const std::string &msg)
    {
    if (i > m_data->size())
    throw std::out_of_range(msg);
    }
    二、new
    1、相对于智能指针,new delete 运算符操作内存非常容易出错。而且,直接管理内存的类与使用智能指针管理的类不同, 它们不能依赖类对象拷贝、赋值和销毁操作的任何默认定义。因此,使用智能指针的程序更容易编写和调试。
    2、new在自由空间分配的内存是无名的,只是返回一个指向该对象的指针。
    1)分配内存;
    2)初始化对象;
    3、默认,动态分配的对象是默认初始化的,那么,这意味着内置类型或组合类型的对象的值将是未定义的,而类类型的对象将使用默认构造函数进行初始化。
    5、定义了自己的构造函数的类类型来说,要求值初始化是没有意义的;不管采用什么形式,对象都会通过默认构造函数来初始化。但对于内置类型,两种形式的差别就很大了;“值初始化”的内置类型有着良好定义的值,
    而默认初始化的对象的值是未定义的。类似的,对于类中那些依赖于编译器合成的默认构造函数的内置类型成员,如果它们未在类内被初始化,那么它们的值也是未定义的。
    6、动态分配内存的几种初始化方式:
    1)默认初始化;
    2)值初始化;
    3)直接初始化;
    =====内置类型举例=========
    1)int *pi = new int; 默认初始化, 值是未定义的。
    2)int *pi = new int(); 值初始化, 有着良好定义的值。
    3)int *pi = new int(1024); 直接初始化。
    =====类类型举例=========
    1)string *ps = new string; 默认初始化为空。
    2)string *ps = new string(); 值初始化为空。
    3)string *ps = new string(10, '9'); 直接初始化 *ps为“9999999999” ; 传统(使用圆括号)方式
    4)vector<int> *pv = new vector<int>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 直接初始化,新标准{使用列表初始化}

    7、C++新
    auto p1 = new auto(obj); 关注点new auto ; 只有当括号中仅有一个单一初始化器时才可以用new auto
    auto p2 = new auto{a, b, c}; 错误!!!
    8、少见用
    动态分配const对象; 用new分配const对象是合法的。 动态分配的const对象必须进行初始化。
    const int * pci = new const int(1024);
    const string * pcs = new const string; 或者 new const string();
    9、少见用
    自由空间用完后,new 会失败并抛bad_alloc异常; "定位new",可以阻止异常抛出,然会一个空指针。
    bad_alloc和nothrow都定义在new头文件中。
    int * pi = new (nothrow) int;
    三、delete
    1、delete 释放的对象,必须指向一个动态分配的内存,或一个“!!!空指针!!!”
    1)销毁对象;
    2)释放内存;

  • 相关阅读:
    0705. Design HashSet (E)
    VMware简单使用
    Git笔记
    初识MyBatis
    数据库连接池配置 testOnBorrow
    Redis list操作命令
    文件/目录对比:diff命令
    可用于区块链的共识算法
    分布式一致性算法,你确定不了解一下?
    Jmeter文件下载测试
  • 原文地址:https://www.cnblogs.com/azbane/p/12433794.html
Copyright © 2011-2022 走看看