不拥有任何指针的shared_ptr称为空shared_ptr。不指向任何对象的shared_ptr称为 null shared_ptr,不应取消引用。请注意,空shared_ptr不一定是 null shared_ptr,null shared_ptr不一定是空shared_ptr。 shared_ptr对象通过运算符 * 和 -> 提供对它们所指向的对象的访问,从而复制有限的指针功能。出于安全原因,它们...
int* ptr = nullptr;//使用 nullptr 初始化指针 2. 检查指针是否为空 在解引用指针之前,总是检查它是否为空。 if(ptr !=nullptr) {//现在可以安全地使用 ptr} 3. 使用智能指针 C++11 引入了智能指针,如std::unique_ptr和std::shared_ptr,它们可以自动管理内存,并在尝试解引用空指针时提供更安全的操作。
首先,我们来谈谈auto_ptr。它类似于原始指针,可以访问类的public成员,并通过get()和reset()函数改变指向的对象。但是,它存在一些限制:避免将auto_ptr放入容器中,因为容器的赋值操作可能导致资源泄漏。判断是否为空时,应使用get()方法。接下来是unique_ptr。它是为了取代auto_ptr而生,C++11引入了...
shared_ptr可以协调对象的析构,但这仅限于其自身的拷贝(也是shared_ptr)之间。 // 在函数被调用时ptr被创建并初始化 void process(shared_ptr<int> ptr) { // 使用ptr } // ptr离开作用域,被销毁 int main() { shared_ptr<int> p(new int(42)); // 引用计数为1 process(p); // 拷贝p会递增它...
weak_ptr 是 shared_ptr 的观察员。它不会干扰shared_ptr所共享的所有权。当一个被weak_ptr所观察的 shared_ptr 要释放它的资源时,它会把相关的 weak_ptr的指针设为空。这防止了 weak_ptr 持有悬空的指针。 这是C++中的概念,在C中,子对象持有父对象的weak_ptr,相当于持有父指针的地址,即指向父指针的指针...
当我们对智能指针进行赋值时,如ptest2 = ptest,ptest2会接管ptest原来的内存管理权,ptest会变为空指针,如果ptest2原来不为空,则它会释放原来的资源,基于这个原因,应该避免把auto_ptr放到容器中,因为算法对容器操作时,很难避免STL内部对容器实现了赋值传递操作,这样会使容器中很多元素被置为NULL。判断一个智能指针...
1) 通过如下 2 种方式,可以构造出 shared_ptr 类型的空智能指针: 注意,空的 shared_ptr 指针,其初始引用计数为 0,而不是 1。 2) 在构建 shared_ptr 智能指针,也可以明确其指向。例如: 由此,我们就成功构建了一个 shared_ptr 智能指针,其指向一块存有 10 这个 int 类型数据的堆内存空间。
shared_ptr采用引用计数的方式管理所指向的对象。当有一个新的shared_ptr指向同一个对象时(复制shared_ptr等),引用计数加1。当shared_ptr离开作用域时,引用计数减1。当引用计数为0时,释放所管理的内存。 这样做的好处在于解放了程序员手动释放内存的压力。之前,为了处理程序中的异常情况,往往需要将指针手动封装到类...
释放指针(表达式)指向的内存块/对象,与把指针(变量)赋值为空指针,是两个没有直接关系的事情。个...
当新的 shared_ptr 对象与指针关联时,则在其构造函数中,将与此指针关联的引用计数增加1。 当任何 shared_ptr 对象超出作用域时,则在其析构函数中,它将关联指针的引用计数减1。如果引用计数变为0,则表示没有其他 shared_ptr 对象与此内存关联,在这种情况下,它使用delete函数删除该内存 ...