[C++ Primer] : 第12章: 动态内存】的更多相关文章

动态内存与只能指针 静态内存用来保存局部static对象, 类static数据成员以及定义在任何函数之外的变量. 栈内存用来保存定义在函数内的非static对象. 分配在静态或栈内存中的对象由编译器自动创建和销毁. 栈中的对象, 仅在其定义的程序块运行时才存在; static对象在使用之前分配, 在程序结束时销毁. 自由空间或堆用来存储动态分配的对象--即在程序运行时分配的对象. 动态对象的生存期由程序来控制, 也就是说, 当动态对象不在使用时, 我们的代码必须显示地销毁它们. 动态内存与智能指…
对象的生存期: 全局对象:程序启动时创建,程序结束时销毁 局部static对象:第一次使用前创建,程序结束时销毁 局部自动对象:定义时创建,离开定义所在程序块时销毁 动态对象:生存期由程序控制,在显式创建时创建,显式销毁时销毁 动态对象的正确释放极易出错.为安全使用动态对象,标准库定义了智能指针来管理动态对象 内存空间: 静态内存:局部static对象.类static数据成员.定义在任何函数之外的变量 栈内存:定义在函数内的非static对象 堆内存:动态对象,即运行时分配的对象 静态内存和栈内…
练习12.1:在此代码的结尾,b1 和 b2 各包含多少个元素? StrBlob b1; { StrBlob b2 = {"a", "an", "the"}; b1 = b2; b2.push_back("about"); } b2被销毁,b1包含4个元素. 练习12.2:编写你自己的StrBlob 类,包含const 版本的 front 和 back. const string& StrBlob::front() c…
shared_ptr和unique_ptr都支持的操作 解释 shared_ptr sp或unique_ptr up 空智能指针,可以指向类型为T的对象 p 将p用作一个条件判断,若p指向一个对象,则为true *p 解引用p,获得它指向的对象 p->mem 等价于(*p).mem p.get() 返回p中保存的指针.要小心使用,若智能指针释放了其对象,返回的指针所指向的对象也就消失了 swap(p, q)或p.swap(q) 交换p和q中的指针 shared_ptr独有的操作 解释 make_…
/* StrVec.h */ #ifndef _STRVEC_H_ #define _STRVEC_H_ #include <memory> #include <string> #include <vector> #include <utility> class StrVec { public: StrVec() : first(nullptr), last_end(nullptr), cap(nullptr){} StrVec(const StrVec&a…
第12章 Java内存模型与线程 Java内存模型  主内存与工作内存: java内存模型规定了所有的变量都在主内存中,每条线程还有自己的工作内存. 工作内存中保存了该线程使用的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行. 内存间交互操作: 1 lock 作用于主内存的变量,它把一个变量标识为一个线程独占的状态. 2 unlock 作用于主内存的变量,把锁定的变量释放出来 3 read 作用于工作内存的变量,把一个变量的值从主内存传输到线程的工作内存中. 4 load 作用于工作…
shared_ptr和new结合使用 一个shared_ptr默认初始化为一个空指针.我们也可以使用new返回的指针来初始化一个shared_ptr: shared_ptr<double> p1; shared_ptr<int> p2(new int(42)); // p2指向一个值为42的int 接受指针参数的智能指针构造函数是explicit的,因此,我们不能将一个内置指针隐式的转换为一个智能指针,必须使用直接初始化形式: shared_ptr<int> p1 =…
C++语言定义了两个运算符来分配和释放动态内存:运算符new分配内存,运算符delete释放new分配的内存. 运算符new和delete 使用new动态分配和初始化对象 在自由空间分配的内存是无名的,因此new无法为其分配的对象命名,而是返回一个指向该对象的指针: int* p = new int; 默认情况下,用new分配的对象进行默认初始化,如果动态分配的对象是一个类,则使用类的默认构造函数.而对于内置类型,它的值将是未定义的. string* str = new string; // 初…
StrBlob是一个管理string的类,借助标准库容器vector,以及动态内存管理类shared_ptr,我们将vector保存在动态内存里,这样就能在多个对象之间共享内存. 定义StrBlob类: #include <iostream> #include <stdexcept> #include <memory> #include <vector> #include <string> #include <initializer_lis…
在C++中,动态内存是的管理是通过一对运算符来完成的:new  ,在动态内存中为对象分配空间并返回一个指向该对象的指针,delete接受一个动态对象的指针,销毁该对象,并释放该对象关联的内存. 动态内存的使用很容器出现错误,确保在正确的时间释放动态内存是极其困难的.有时候我们会忘记释放动态内存,这样就会造成内存泄露:或者是一个对象还没有使用完,就释放了它所关联的内存,再去使用它,就会造成难以预估的错误. 因此,为了更好地管理使用动态内存,C++11新标准提供了两种智能指针:shared_ptr和…