智能指针是基于类模板生成的,因此,要初始化一个智能指针,就必须声明指针所指向的数据类型,不然智能指针里面包含的原始指针是个空指针。 初始化方式一,在智能指针构造函数中new一个新对象。 代码语言:javascript 复制 structC{int a;int b;};std::shared_ptr<C>p1(newC);std::unique_ptr<int>p2(newint(40))...
C++11在标准库的<memory>头文件中定义了三种类型的智能指针。1、unique_ptr 一个unique_ptr拥有它指向的对象的独占所有权,并且会在指针超出范围时销毁该对象。unique_ptr明确地阻止复制其包含的指针。不过可以使用std::move函数必须用于将包含的指针的所有权转移给另一个unique_ptr。示例代码 2、shared_ptr 引用计数...
使用智能指针来管理内存可以避免手动调用malloc和free函数,提高代码的可读性和可维护性。通常,我们可以通过重载指针运算符和删除器(deleter)来实现智能指针的功能。重载指针运算符可以使智能指针的使用方式类似于常规指针,而删除器则定义了智能指针在释放内存时的行为,例如使用free或delete操作释放内存。 3. 学习C语言智能...
在智能指针的模板类里重写operator->运算符 在智能指针的模板类的析构函数里,释放它指向的内存空间 管理指针的所有权和转移(下面的例子没有实现) #include<iostream>#include<memory>using namespacestd; template<typename T>classmy_auto_ptr{public: my_auto_ptr(T* p = nullptr):own(p!=nullptr),ptr(p)...
这个习惯用法的主要目标是确保在初始化对象的同时获取资源,以便在一行代码中创建并准备好对象的所有资源。实际上,RAII 的主要原则是将任何堆分配资源(例如,动态分配的内存或系统对象句柄)的所有权授予堆栈分配的对象,该对象的析构函数包含删除或释放资源的代码和还有任何相关的清理代码。原始指针和智能指针的对比。
03. 不要使用NULL指针 大家都知道,在程序中不能使用NULL指针,但是如果不注意,程序中还是有可能在你的意料之外就使用到NULL指针,下面看两个比较容易出问题的例子。动态内存分配函数分配内存的时,有可能会分配失败,此时返回NULL 从程序运行结果来看,malloc分配失败返回NULL赋给p,再通过p访问其所指向的0地址内存...
在使用基本指针类型时,因为要手动释放指针指向的内存,常常容易造成内存泄漏,特别是异常分支很多的情况下。而智能指针类型就是将基本指针类型封装成模板类,以便更好地管理内存。 智能指针都包含一个explicit构造函数,因此基本指针类型不能隐式转换成智能指针,需要显式
{//管理 裸指针 和 处理这个指针的函数 -- 可以管理应用delete资源,也可以管理其他类似资源ObjectPtr obj(newObject(2), deleteOfObject); ObjectPtr obj2=obj; }intmain() { interfaceOfSharedPtr();return0; } 1. 2. 3. 4. 5. 6. 7.
(1)函数调用的自变量匹配规则 (2)隐式型别转换函数 (3)template functions的暗自具现化 (4)member function templates。我承认,这有点太深入了。 在智能指针中const和non-const之间的转化也是很大的学问,我看了Meyers使用unions来做实现。这不是我喜欢的做法,我觉得风险还是比较大的。
weak_ptr是用来辅助shared_ptr的,每一个weak_ptr它指向weak_ptr而不是实际的操作函数 为什么推荐用makeshared创建指针 优点是: 它分配的时候,只分配一次,而shared_ptr的构造函数需要分配两次。效率更高更安全 缺点是: 如果有weak_ptr不推荐使用,否则会出现知道最后一个weak_ptr被释放了才真正去释放管理的对象 ...