C++ Primer书上这个例子讲的很不错,写写帮助自己理解标准库和智能指针. .h 文件内容 #include <fstream> #include <iostream> #include <vector> #include <string> #include <map> #include <set> #include <sstream> #include <memory> class QueryResult…
WPF提供了三个用于输入文本的控件:TextBox.RichTextBox和PasswordBox.PasswordBox控件直接继承自Control类.TextBox和RichTextBox控件间接继承自TextBoxBase类. 与前面看到的内容控件不同,文本框能够包含的内容类型是有限的.TextBox控件总是存储字符串(由Text属性提供).PasswordBox控件也处理字符内容(由Password属性提供),尽管为了减轻特定类型的攻击,它在内部使用SecureString属性.只有Ri…
unique_ptr 一个unique_ptr拥有它所管理的对象,与shared_ptr不同,unique_ptr指向的对象只能有一个用户.当unique_ptr被销毁后,它所指向的对象也被销毁. 定义一个unique_ptr时,需要将其绑定到一个new返回的指针上,类似shared_ptr,初始化unique_ptr必须采用直接初始化形式: unique_ptr<double> p1; // p1指向一个double类型变量 unique_ptr<int> p2(new int(…
//1.标准库提供了两种智能指针类型来管理动态对象,均定义在头文件memory中,声明在std命名空间. // shared_ptr:允许多个指针指向同一个对象. // unique_ptr:独占所指的对象. // 标准库还定义了weak_ptr的伴随类,它是一种弱作用.指向shared_ptr所管理的对象. //2.shared_ptr和unique_ptr均支持的操作: shared_ptr<T> sp unique_ptr<T> up:空智能指针,指向类型为T的对象 p :将…
标准库allocator类定义在头文件 <memory>中.它帮助我们将内存分配和构造分离开来,它分配的内存是原始的.未构造的. 类似vector,allocator也是一个模板类,我们在定义一个allocator类类型的时候需要制定它要分配内存的类型,它会根据给定的对象类型来确定恰当的内存大小和对齐位置: allocator<string> alloc; auto const p = alloc.allocate(n); // 分配n个未初始化的string allocator类…
动态数组的分配和释放 new和数组 C++语言和标准库提供了一次分配一个对象数组的方法,定义了另一种new表达式语法.我们需要在类型名后跟一对方括号,在其中指明要分配的对象的数目. int* arr = new int[20]; // arr 指向第一个int 方括号中的大小必须是整数,但不必是常量. 可以使用typedef来表示数组类型的别名: typedef int arrT[42]; int* p = new arrT; // 分配一个42个int的数组,p指向第一个int 虽然我们通常称…
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和…