了解了C的指针后,理解C++的中的智能指针便不在话下。 数据传递 C语言中有值传递和地址传递的概念。在介绍指针之前,我们先回顾下C语言中这2种数据传递的方式。 值传递:基本数据类型、结构体类型作为函数参数都是值传递。 值传递是简单的数据拷贝,他们的内存地址是不同的。 以函数参数为例,在函数中修改形参的值...
另外一点:C语言无法在参数中传递数组,一切数组在函数参数传递时退化为指针,因此如果没有指针,数组将无法通过函数参数传递。 还有一点,在C语言中函数是一个指针,如果没有指针,就无法定义C语言函数,无法使用和调用C语言函数,更无法将函数作为一个变量传递。——换句话说,没有指针,C语言将没有函数,一个没有函数的语...
a.智能指针的关键技术:在于构造栈上对象的生命期控制 堆上构造的对象的生命期.因为在智能指针的内部,存储 着堆对象的指针,而且在构析函数中调用delete行为. 大致机构如下: x* m_PTRx = new x(100);//#1 template<typename T> auto_ptr{ private: T* m_PTR;//维护指向堆对象的指针,在auto_ptr定位后 ....
智能指针,本质上是对资源所有权和生命周期管理的抽象: 当资源是被独占时,使用 std::unique_ptr 对资源进行管理。 当资源会被共享时,使用 std::shared_ptr 对资源进行管理。 使用std::weak_ptr 作为 std::shared_ptr 管理对象的观察者。 通过继承 std::enable_shared_from_this 来获取 this 的 std::shared_...
智能指针也是模板类,因此当我们创建一个智能指针是要提供额外的信息——指针可以指向的类型。默认初始化的智能指针保存着一个空指针。shared_ptr允许多个指针指向同一对象。 shared_ptr<string> p1;//可指向stringshared_ptr<list<int>> p2;//可指向int的list ...
创建一个类,作为智能指针的封装。这个类将管理底层指针,并提供安全和方便的操作。 在类中添加一个私有成员变量,用于存储底层指针。 实现构造函数,接受一个原始指针作为参数,并将其存储在私有成员变量中。可以在构造函数中对指针进行必要的检查和处理。 实现析构函数,用于在对象销毁时释放底层指针所占用的资源。这可以...
unique_ptr:c++11版本,独占对所指对象的独有权,不允许其他的智能指针共享其内部的指针,禁止进行拷贝构造和拷贝赋值的操作,但是unique_ptr允许通过函数返回给其他的unique_ptr,还可以通过std::move来把所有权转让到其他的unique_ptr,注意,这时它本身就不再拥有原来指针的所有权了。将一个 unique_ptr 赋值给另一个时...
赋值对象时应确保复制 “对象内的所有成员变量” 及 “所有 base class 成分”(调用基类复制构造函数) 以对象管理资源(资源在构造函数获得,在析构函数释放,建议使用智能指针,资源取得时机便是初始化时机(Resource Acquisition Is Initialization,RAII)) 在资源管理类中小心 copying 行为(普遍的 RAII class copying 行为...
如果函数退出,那么和作为栈上局部变量,智能指针本身调用自己的析构函数,给引用的对象引用计数减去1(本质采用引用计数,当引用计数为0的时候,才会删除对象)。此时如下图所示,可以看到智能指针的引用计数仍然为1, 这也就导致了这两个节点的实际内存,并没有被释放掉, 从而导致内存泄露。
空指针的解引用通常会导致段错误,但并非总是如此。许多嵌入式系统有映射到地址0处的寄存器,因此覆写它们会产生不可预知的后果。在某些情况下,解引用空指针会导致任意代码的执行。 引用已释放内存:除非指向某块内存的指针已设置为NULL或以其它方式被覆写,否则就有可能访问已被释放的内存。