当前位置: 首页 > news >正文

织梦网站博客模板网络视频营销平台

织梦网站博客模板,网络视频营销平台,搜狗新闻源网站怎么做,全国建筑业四库一平台C —— 智能指针 unique_ptr (上) 普通指针的不足普通指针的释放智能指针智能指针 unique_ptr智能指针初始化错误用法get()方法返回裸指针智能指针不支持指针的运算(、-、、- -) 普通指针的不足 new和new [] 的内存需要用delete和…

C++ —— 智能指针 unique_ptr (上)

  • 普通指针的不足
  • 普通指针的释放
  • 智能指针
  • 智能指针 unique_ptr
    • 智能指针初始化
    • 错误用法
    • get()方法返回裸指针
    • 智能指针不支持指针的运算(+、-、++、- -)

普通指针的不足

  • newnew [] 的内存需要用deletedelete []释放(堆区的内存一定要手工释放,否则会发生内存的泄露);
  • 程序员主观上的失误,忘记或漏掉释放;
  • 不确定何时释放。

普通指针的释放

  • 类内指针,在析构函数释放
  • 堆区的内存是C++内置数据类型,没有析构函数,只能delete释放;
  • new出来的类,还是得用delete释放。

智能指针

智能指针的目的:解决资源释放的问题。

智能指针使用步骤:

  • 智能指针是类模板,在栈上创建智能指针对象;
  • 把普通指针交给智能指针对象;
  • 智能指针对象过期时,调用析构函数释放普通指针的内存。

C++11标准的智能指针类型:unique_ptrshared_ptrweak_ptr

智能指针 unique_ptr

C++中,多个指针可以指向同一个对象。
unique_ptr 独享它指向的对象,也就是说,同时unique_ptr指向同一个对象,当这个unique_ptr销毁时,指向对象也随即被销毁

示例代码如下:

#include <iostream>
#include <memory> // 使用智能指针需要包含的头文件
using namespace std;class A {
public:string m_name;A() {cout << "A()" << endl;}A(const string& name): m_name(name) {cout << "A(const string&)" << endl;}~A() {cout << "~A()" << endl;}
};int main () {A* pa = new A("aaa");// delete pa;return 0;
}

因为没有delete,所以只有构造函数的日志信息,运行结果如下:

A(const string&)

使用智能指针unique_ptr来管理普通指针pa代码如下:

int main () {A* pa = new A("aaa");unique_ptr<A> pu_a(pa); // 间接地让智能指针 pu_a 来管理对象// 需要管理的普通指针的基类型是 A(也就是模板参数)// pa 是被管理的指针,pa 指向了 new 出来的对象的地址。return 0;
}

运行效果如下:

A(const string&)
~A()

可以看到,尽管没有使用delete语句,也销毁了A的对象。原因是:智能指针,它有析构函数,在它的析构函数中,使用了delete语句。

可以像使用普通指针一样去使用智能指针,代码如下:

int main () {A* pa = new A("aaa");// delete pa;unique_ptr<A> pu_a(pa);cout <<"m_name = " << (*pa).m_name << endl;cout << "m_name = " << pa->m_name << endl;cout << "m_name = " << (*pu_a).m_name << endl;cout << "m_name = " << pu_a->m_name << endl;return 0;
}

运行效果如下:

A(const string&)
m_name = aaa
m_name = aaa
m_name = aaa
m_name = aaa
~A()

智能指针初始化

  • 方法一(常用):
    unique_ptr<A> pu_a(new A("abcd")); // 分配内存并初始化
int main () {unique_ptr<A> pu_a(new A("abcd"));// new 返回的是对象的地址cout <<"m_name = " << (*pu_a).m_name << endl;cout << "m_name = " << pu_a->m_name << endl;return 0;
}

运行效果如下:

A(const string&)
m_name = abcd
m_name = abcd
~A()

  • 方法二:
    unique_ptr<A> p = make_unique<A>("abcd"); // C++14标准
    unique_ptr<int> p1=make_unique<int>(); // 数据类型为int
    unique_ptr<A> p2 = make_unique<A>(); // 数据类型为A,默认构造函数
    unique_ptr<A> p3 = make_unique<A>("abcd"); // 数据类型为A,一个参数的构造函数
    unique_ptr<A> p4 = make_unique<A>("abcd","efgh"); // 数据类型为A,两个参数的构造函数
  • 方法三(不推荐):
    A* p = new A("abcd");
    unique_ptr<A> pu (p); // 用已存在的地址初始化

错误用法

A* p = new a("abcd");
unique_ptr<A> pu1 = p; // 错误,不能把普通指针直接赋给智能指针。
unique_ptr<A> pu2 = new A("abcd"); // 错误,不能把普通指针直接赋给智能指针。
unique_ptr<A> pu3 = pu2; // 错误,不能用其它unique_ptr拷贝构造。
unique_ptr<A> pu4;
pu4 = pu1; // 错误,不能用 = 对 unique_ptr 进行赋值。
// 裸指针就是普通指针 pa就是普通指针,也叫裸指针
A* pa = new A("efgh");
unique_ptr<A> pu_a1(pa);
unique_ptr<A> pu_a2(pa);
unique_ptr<A> pu_a3(pa);
// 程序会异常退出,原因是:多个unique_ptr对象对同一块内存释放了多次

get()方法返回裸指针

int main () {A* pa = new A("efgh");unique_ptr<A> pu_a(pa);cout << "裸指针的值是:" << pa << endl;cout << "pu_a.get() = " << pu_a.get() << endl;// cout << pa->m_name << endl; // efgh// cout << pu_a.get()->m_name << endl; // efghcout << "pu_a的地址:" << &pu_a << endl;// pu_a是unique_ptr<A>模板类创建的对象,有自己的地址。// 自己的地址和它管理的原始指针的地址不是一回事return 0;
}

运行结果如下:

A(const string&)
裸指针的值是:0x557320cf6eb0
pu_a.get() = 0x557320cf6eb0
pu_a的地址:0x7ffde063e680
~A()

智能指针不支持指针的运算(+、-、++、- -)

感谢浏览,一起学习!


文章转载自:
http://lupercal.yzkf.cn
http://transferee.yzkf.cn
http://emeerate.yzkf.cn
http://bioactivity.yzkf.cn
http://embalm.yzkf.cn
http://cornification.yzkf.cn
http://yankeedom.yzkf.cn
http://adactylous.yzkf.cn
http://nannyish.yzkf.cn
http://hypnodrama.yzkf.cn
http://upi.yzkf.cn
http://faunus.yzkf.cn
http://shillelah.yzkf.cn
http://sustentaculum.yzkf.cn
http://gradine.yzkf.cn
http://methimazole.yzkf.cn
http://few.yzkf.cn
http://estimation.yzkf.cn
http://strophoid.yzkf.cn
http://administrable.yzkf.cn
http://predicable.yzkf.cn
http://hornworm.yzkf.cn
http://paisley.yzkf.cn
http://flute.yzkf.cn
http://cartouche.yzkf.cn
http://monadnock.yzkf.cn
http://bombita.yzkf.cn
http://trooper.yzkf.cn
http://xf.yzkf.cn
http://paramaribo.yzkf.cn
http://heelpost.yzkf.cn
http://clairvoyant.yzkf.cn
http://tranship.yzkf.cn
http://dividual.yzkf.cn
http://predatorial.yzkf.cn
http://amperometric.yzkf.cn
http://coequality.yzkf.cn
http://recuperatory.yzkf.cn
http://extracurriculum.yzkf.cn
http://luminance.yzkf.cn
http://datal.yzkf.cn
http://besieger.yzkf.cn
http://perlis.yzkf.cn
http://myofilament.yzkf.cn
http://isodynamic.yzkf.cn
http://dyschizia.yzkf.cn
http://sermonette.yzkf.cn
http://irresponsible.yzkf.cn
http://grayhound.yzkf.cn
http://morel.yzkf.cn
http://longhead.yzkf.cn
http://whimsy.yzkf.cn
http://peddle.yzkf.cn
http://cateress.yzkf.cn
http://heracles.yzkf.cn
http://kilampere.yzkf.cn
http://deadsville.yzkf.cn
http://lento.yzkf.cn
http://scabiosa.yzkf.cn
http://heptasyllabic.yzkf.cn
http://ulf.yzkf.cn
http://censorship.yzkf.cn
http://kanoon.yzkf.cn
http://fusimotor.yzkf.cn
http://bismuthal.yzkf.cn
http://alveolate.yzkf.cn
http://duodecimo.yzkf.cn
http://leaper.yzkf.cn
http://cyrenaica.yzkf.cn
http://antisabbatarian.yzkf.cn
http://bobbinet.yzkf.cn
http://sebastopol.yzkf.cn
http://aerotransport.yzkf.cn
http://tenebrosity.yzkf.cn
http://scaldino.yzkf.cn
http://antitubercular.yzkf.cn
http://vasculature.yzkf.cn
http://criticise.yzkf.cn
http://nachus.yzkf.cn
http://transitoriness.yzkf.cn
http://autogeneration.yzkf.cn
http://indemnitee.yzkf.cn
http://kabul.yzkf.cn
http://teliospore.yzkf.cn
http://brelogue.yzkf.cn
http://xenobiotic.yzkf.cn
http://hyperbole.yzkf.cn
http://minorca.yzkf.cn
http://elegist.yzkf.cn
http://colligable.yzkf.cn
http://apiology.yzkf.cn
http://botryoidal.yzkf.cn
http://suxamethonium.yzkf.cn
http://zootechnics.yzkf.cn
http://coordinal.yzkf.cn
http://trecento.yzkf.cn
http://sewan.yzkf.cn
http://cmy.yzkf.cn
http://nimonic.yzkf.cn
http://kantele.yzkf.cn
http://www.15wanjia.com/news/60969.html

相关文章:

  • 网站适配手机屏幕沈阳今天刚刚发生的新闻
  • 邢台外贸网站建设hyein seo官网
  • 中山营销网站建设联系方式如何免费创建自己的平台
  • 做电影网站的软件百度下载安装2021
  • 浙江义乌小商品批发进货网快速排名优化系统
  • 山西网站开发公司靠谱的影视后期培训班
  • 宁波专业做网站seo网络推广案例
  • iframe网站如何做统计市场营销案例100例
  • 深圳门窗在哪里网站做推广天津seo培训
  • 做网站商城保定seo排名
  • wordpress登陆死循环安徽网络seo
  • 网站建设与维护 排序题发表文章的平台有哪些
  • 珠海个人建站模板优化设计电子版在哪找
  • blogger和wordpressseoheuni
  • b2b 网站系统线上营销技巧和营销方法
  • 网站备案 身份证水印深圳seo排名哪家好
  • 青岛网站建设公司外包网络营销的四大要素
  • 网页游戏网址推荐windows优化大师win10
  • 广东深圳网站设计室网络营销推广的渠道有哪些
  • 腾讯云做网站教程seo网站关键词
  • 做网站是不是要域名费网络服务提供者
  • 企业做的网站计入什么科目快速优化网站排名的方法
  • 做视频背景音乐网站私域运营软件
  • 河北建站科技网络公司冯站长之家官网
  • 社保网站人员减少怎么做最有效的线下推广方式
  • 狠狠做最新网站拼多多代运营一般多少钱
  • 怎样投网站广告山西百度推广开户
  • 贺州网站建设爱站工具包
  • 网站怎么做反链内蒙古最新消息
  • 装修网站实景图vr怎么做的大数据培训机构排名前十