C++智能指针模板类复习

//C++智能指针模板类复习

#include<iostream>

#include<memory>

using namespace std;

//智能指针用于确保程序不存在内存和资源泄漏且是异常安全的。

//C++98中提供了auto_ptr,C++11摒弃了auto_ptr,并提出了unique_ptr 、shared_ptr、weak_ptr

void show1()

{

int* p = new int(4);

cout << *p << endl;

}

void show2()

{

int* p = new int(5);

try

{

if(1)//这里只做假设

{

throw "error";

}

}

catch(const char* er)

{

cout << er << endl;

return;

}

cout << 1 << endl;

delete p;

}

void show3()

{

auto_ptr<int> p(new int(5));

cout << *p << endl;

}

unique_ptr<int> get()

{

unique_ptr<int> p(new int(5));

return p;

}

int main()

{

/*

//智能指针的目的

show1();//show1很明显造成了内存泄露,虽然指针p随着show1的结束而销毁,但是开辟的堆空间仍然存留

show2();//show2很明显如果try中遇到了错误程序退出,那么也会造成内存泄露

show3();//auto_ptr实际上是一个用int实例化的模板类,对于开辟空间的回收写在了类的析构函数中,所以随着p对象的销毁,堆空间也跟随销毁

*/

/*

//auto_ptr之间的指针对象在进行互相赋值时,将会转让对开辟的空间地址的所有权,如果不转让所有权的话,会对同一个堆内存进行多次回收,造成错误

auto_ptr<int> temp1(new int(5));

cout << *temp1 << endl;

auto_ptr<int> temp2(temp1);//此时temp1将开辟的堆空间的首地址传给temp2,并且temp1不再拥有

//cout << *temp1 << endl;//这里将会发生错误,因为temp1已经为空

*/

/*

//shared_ptr之间的对象在进行互相赋值时不会转让所有权,这是因为shared_ptr采用了计数机制,当有多个智能指针同时指向一个堆空间时,

//一个指针对象的销毁不会回收堆空间,只有当计数为1时,此时只有一个指针指向堆空间,此时指针对象销毁时才回收堆空间

shared_ptr<int> temp3(new int(5));

cout << *temp3 << endl;

shared_ptr<int> temp4(temp3);

cout << *temp3 << endl;//此时不会报错

*/

/*

//unique_ptr 类似于auto_ptr,也建立了所有权的概念,但是不用的是unique_ptr不允许普通对象之间的赋值,否则将会在编译时报错,但是有一种特殊情况,我们接下来介绍

unique_ptr<int> temp5(new int(5));

cout << *temp5 << endl;

//unique_ptr<int> temp6(temp5);//这里将会报错

unique_ptr<int> temp6 = get(); //这是唯一的一种特殊情况,因为get函数把p返回后立即销毁原先的指针,所以不存在日后出错的说法,所以允许这种赋值

cout << *temp6 << endl;

*/

/*

//weak_ptr结合 shared_ptr 使用的特例智能指针。 weak_ptr 提供对一个或多个 shared_ptr 实例拥有的对象的访问,但不参与引用计数。

//如果你想要观察某个对象但不需要其保持活动状态,请使用该实例。 在某些情况下,需要断开 shared_ptr 实例间的循环引用。

shared_ptr<int> temp7(new int(5));

weak_ptr<int> a(temp7);        //use_count成员函数用来显示目前的shared_ptr指针的计数

cout << a.use_count() << endl; //因为a是对象,use_count是a的成员函数,所以用.

shared_ptr<int> temp8(temp7);

cout << a.use_count() << endl;

*/

return 0;

}

时间: 2024-10-14 00:32:25

C++智能指针模板类复习的相关文章

C++_智能指针模板类

智能指针是行为类似于指针的类对象,但这种对象还有其他功能. 本节介绍三个可帮助管理动态内存分配的智能指针模板(auto_ptr.unique_ptr和shared_ptr). void remodel(std:string & str) { std::string * ps = new std::string(str); ... str = ps; return; } 这段代码有缺陷,每当调用时,该函数都分配堆中的内存,但从不回收,从而导致内存泄漏: 但是有解决之道——在return语句前添加下

《C++ Primer Plus》16.2 智能指针模板类

智能指针是行为类似于指针的类对象,单这种对象还有其他功能.本节介绍三个可帮助管理动态内存分配的智能指针类.先来看看需要哪些功能以及这些功能是如何实现的.请看下面的函数:void remodel(std::string & str){    std::string * ps = new std::string(str);    ...    str = ps;    return;}您可能发现了其中的缺陷.每当调用时,该函数都分配堆中的内存,单从不回收,从而导致内存泄漏.您肯呢哥也知道解决之道——

[cocos2dx笔记014]一个用于cocos2dx的对象智能指针模板

现在C++智能指针有无数个实现了,多一个也无所谓.哈. 这个智能指针是专门为cocos2dx 2.2.x定制的.主要是为了方便使用,同时又要遵循现有的cocos2dx的内存管理.特实现这样一个智能指针.在使用的时候不需要考虑retain或release操作,也不需要new或delete操作! 下面是实现代码 //在很多时候,类的成员是CCObject的子对象,为了保证对其正常使用,又要遵循cocos2dx的内存管理,特实现了这样的一个智能指针,方便使用. #ifndef _X_COCOS_PTR

C++智能指针管理类

1.程序员明确的进行内存释放 对于c++程序员,最头脑的莫过于对动态分配的内存进行管理了.c++在堆上分配的内存,需要程序员负责对分配的内存进行释放.但有时内存的释放看起来并不件很轻松的事,如下程序 void func() { int *p = new int(0); if(一些判断) { return; } p = new int(1); delete p; } 这个函数没有任何意义,只为说明问题.func函数至少有三处问题.1.一旦if的判断条件成立,就会立马执行返回语句.此时p所指向的内存

C++模板类复习

//C++模板类复习 #include<iostream> using namespace std; template <class T1, class T2 = string> class test { private: T1 temp1; T2 temp2; public: test(){} test(T1 data1, T2 data2):temp1(data1),temp2(data2){} void show(); }; template <class T1, cl

[cocos2dx注意事项014]一个用于cocos2dx对象智能指针模板

现在,C++有许多实现智能指针,一个更无所谓.哈. 这种智能指针是专为cocos2dx 2.2.x自定义.主要的易用性,同时必须遵循现有的cocos2dx内存管理.特殊实现这样的智能指针.无需在使用时考虑retain要么release操作.须要new或delete操作! 以下是实现代码 //在非常多时候,类的成员是CCObject的子对象,为了保证对其正常使用,又要遵循cocos2dx的内存管理.特实现了这种一个智能指针,方便使用. #ifndef _X_COCOS_PTR_H_ #define

智能指针模版类

有三个智能指针,auto_ptr(弃用).unique_ptr.shared_ptr. 智能指针可以自动跟踪动态内存,在其过期时自动释放. 一.shared_ptr 用于new创建的对象,而不适用于new[]创建的对象, 用于多个指针共享一个地址的情况. #include<memory> std::shared_ptr<int> int_ptr=new int; //std::shared_ptr<int> int_ptr(new int); 二.unique_ptr

C++中智能指针的模板类

在C++中,智能指针是一个非常重要的概念.因为C++的类动态分配的对象不能自动释放掉,需手动调用new运算符.当程序员大意时,或程序发生异常时,或许就会发生没有手动释放内存而造成内存泄露. 智能指针的定义:就是在一个类中,存在一个指向另一个类对象的指针,并通过对指针运算符(比如:->,*)的重载,就可以实现利用当前类的对象通过指针运算符来操纵另一个类的成员(就像另一个类的指针操作一样),并且,在析构函数中定义了delete操作,借助于变量的作用域,能够实现类对象空间的自动释放. 在C++ 11中

STL模板_智能指针概念

一.智能指针1.类类型对象,在其内部封装了一个普通指针.当智能指针对象因离开作用域而被析构时,其析构函数被执行,通过其内部封装的普通指针,销毁该指针的目标对象,避免内存泄露.2.为了表现出和普通指针一致的外观和行为,重载了解引用运算符(*)和间接成员访问运算符(->)函数,令其使用者可以将一个智能指针当成普通指针一样地使用.3.智能指针没有拷贝语义,只有转移语义,任何时候都只有一个智能指针对象持有真正的对象地址.4.智能指针不支持对象数组.二.模板的非类型参数1.无论是函数模板还是类模板,其模板