智能指针

C++11智能指针的前因后果

余生颓废 提交于 2019-12-07 16:35:24
0 前言 据说用过java的人都说java好,很大一部分是java里没有指针的概念,并提供自动垃圾机制,而C/C++语言经常会被内存的释放问题搞得头疼。 全局对象在程序启动时分配,在程序结束时销毁。对于局部自动对象,当我们进入其定义所在的程序块时被创建,在离开块时销毁。局部stratic对象在第一次使用前分配,在程序结束时销毁。 对于自动和static对象外,C++还支持动态分配对象。动态分配的对象的生存期与它们在哪儿创建是无关的,只有当显示地被释放时,这些对象才会销毁。 动态对象的正确分配/释放被证明是编程中极其容易出现错误的地方,从语言层次上归纳为以下问题: (1)野指针(空悬指针) :一些内存单元已经被释放,之前指向它的指针却还在被使用。这些内存有可能被运行的系统重新分配给程序使用,从而导致了无法预测的错误。 解决措施:delete后,将nullptr赋予指针,表明指针不指向任何对象。但可能有多个指针指向相同的内存,在delete内存后重置指针只对这个指针有效,对其他任何仍指向(已释放的)的内存的指针式没有作用。 int *p(new int(42) // p指向动态内存 auto q = p; // p和q指向相同的内存 delete p; // p和q均变为无效 p = nullptr; // 指出p不再绑定任何对象 (2)重复释放 :程序试图去释放已经释放过的内存单元

GameHollywood 面试笔记

依然范特西╮ 提交于 2019-12-06 12:25:14
GameHollywood 面试笔记 Intro 面试的职位是 C++开发工程师,主要聊的还是C++。在过程中自我感觉面得还行,至少没 上次 那么蠢。 聊的内容主要集中在STL和线程安全、资源管理的层面。 惯例的,填完面试信息表并简历一起上交,然后等面试官来客套完,就开始聊技术了。 注意,面试官的提问并非原话,有修饰和脑补。 0. 预热:你用哪个版本的C++? 客套话什么的就略了。 面试官:...行,那我们就聊聊C++吧。你常用哪个版本的C++? 我:我比较常用的是C++11。 C++版本这个问题面试里应该不多见,不过作为引入的话题还行,标准之神会瞑目的。 对于 C++版本 这个词,很大概率上大家说的应该就是C++标准委员会 WG21 制定的C++标准了,最新版本的标准文档是C++17定稿 N4659 ,制定中的C++20标准文档可以访问 WG21/docs/papers/2018 查阅。 需要注意的是,如果答成了 我用VC6 之类的骚话,很大概率会留下不好的映像——或者对方也是忠实的VC6神教教徒的话,达成共识也说不定。 闲话少叙。 1. 起手式: std::shared_ptr 面试官:说说 std::shared_ptr 是怎么实现的?一般怎么去使用它? 答: shared_ptr 是通过 引用计数 实现的,它可以作为容器元素,在程序里传递blabal.....而且

C++boost & pcl::PointCloud< PointT >::Ptr

ぃ、小莉子 提交于 2019-12-05 04:39:36
pcl::PointCloud< PointT >::Ptr PCL官网/帮助文档 函数定义 using pcl::PointCloud< PointT >::Ptr = boost::shared_ptr<PointCloud<PointT> > 有关boost库里的智能指针: Boost::shared_ptr,创建一个简单的智能指针是非常容易的。但是创建一个能够在大多数编译器下通过的智能指针就有些难度了。而创建同时又考虑异常安全就更为困难了。Boost::shared_ptr这些全都做到了。 来源: https://www.cnblogs.com/chenlinchong/p/11906539.html

智能指针.Qt测试

六眼飞鱼酱① 提交于 2019-12-05 02:23:10
1、Qt598x64vs2017(或 Qt598x86vs2015[配置使用vs2017])、Win10x64 2、测试代码:  2.1、MainWindow.h class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: int Fidx; QVector<std::shared_ptr<SmartPtr>> Fvtr; //QVector<std::unique_ptr<SmartPtr>> Fvtr; private slots: void on_pbtnSmartPtrAdd_clicked(); void on_pbtnSmartPtrDel_clicked(); }; class SmartPtr { public: SmartPtr(int i):Fi(i){ qDebug()<< "SmartPtr(...) :" << Fi; } ~SmartPtr(){ qDebug()<< "~SmartPtr(...) :" << Fi; } private: int Fi; };  2.2、MainWindow.cpp void MainWindow::on

C/C++ 智能指针线程池

二次信任 提交于 2019-12-05 01:56:58
ThreadPool.h { #ifndef __THREADPOOL_H__ #define __THREADPOOL_H__ #include <memory> #include <mutex> #include <iostream> #include <thread> #include <vector> typedef unsigned int THREADHANDLE; static THREADHANDLE ThreadHanle = -1; #define THREADBEGIN(var) if(var == ThreadHanle){return;} /* #include "ThreadPool.h" mutex m; void func(int threadID) { while (true) { THREADBEGIN(threadID); std::lock_guard<mutex> lg(m); static int time = GetTickCount(); static int index = 0; if (GetTickCount() - time >= 1000) { std::cout << index <<" threadNum: "<< threadID << std::endl; time = GetTickCount(); index++

C++之智能指针std::shared_ptr简单使用和理解

十年热恋 提交于 2019-12-05 00:57:03
1 智能指针std::shared_ptr相关知识和如何使用 我们这里先说下智能指针std::shared_ptr,因为我看到我我们项目c++代码里面用得很多,我不是不会,所以记录学习下 先让ubuntu终端支持c++11,如果自己的电脑还没配置号,可以先看下我的这篇博客linux之让终端支持C++11/14编译cpp文件 1) 所在的头文件 #include <memory> 2) 介绍: shared_ptr是一种智能指针(smart pointer),作用有如同指针,但会记录有多少个shared_ptrs共同指向一个对象。这便是所谓的引用计数(reference counting),比如我们把只能指针赋值给另外一个对象,那么对象多了一个智能指针指向它,所以这个时候引用计数会增加一个,我们可以用shared_ptr.use_count()函数查看这个智能指针的引用计数,一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除,当我们程序结束进行return的时候,智能指针的引用计数会减1,不知道我理解有没有问题.有的话请老铁们指出. 3) share_ptr的三种初始化方法 1.通过一个指向堆上申请的空间的指针初始化(切记不要用栈上的指针,否则,当智能指针全部释放控制权(栈中的对象离开作用域本身就会析构一次),将会析构对象,导致出错) 比如如下

C/C++ 智能指针

ぃ、小莉子 提交于 2019-12-04 14:05:25
// 转载自 :https://www.cnblogs.com/wuyepeng/p/9741241.html { 为什么要使用智能指针:我们知道c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的delete语句就返回了,如果我们不在每一个可能跳转或者返回的语句前释放资源,就会造成内存泄露。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。下面我们逐个介绍。 auto_ptr ( 官方文档 ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #include<iostream> #include<memory>//auto_ptr的头文件 using namespace std; class Test { public : Test(string s) { str = s; cout<< "Test creat\n" ; } ~Test() { cout<< "Test

12动态内部才能

不羁岁月 提交于 2019-12-04 13:29:39
12.1.1 shared_ptr #include<memory>头文件 使用动态内存的原因是允许多个对象共享相同的状态。 负责自动释放所指向的对象,允许多个指针指向同一个对象。 shared_ptr<string>p1; //指向string的share_ptr指针 shared_ptr<list<int>>p2; //指向int的list的share_ptr指针。 一般的操作:shared_ptr和unique_ptr都支持 shared_ptr 操作 shared_ptr<T> sp 空智能指针,可以指向类型为T的对象 p 将p作为一个条件判断,若p指向一个对象,则为true *p 解引用p,获得它指向的对象 p->men 等价于(*p).men p.get() 返回p中保存的指针,要小心使用,若智能指针释放了其对象,返回的指针所指向的对象也就消失了。 swap(p,q) 交换p和q中的指针 p.swap(q) 交换p和q中的指针 shared_ptr特有支持的操作 shared_ptr 操作 make_shared<T>(args) 返回一个share_ptr,指向一个动态分配的类型为T的对象。使用args初始化此对象。 shared_ptr<T>p(q) p是shared_ptr q的拷贝:此操作会递增q中的计数器。q中的指针必须能转换为T*. p = q

[Boost] Boost智能指针——boost::shared_ptr(使用及原理分析)

杀马特。学长 韩版系。学妹 提交于 2019-12-03 17:30:46
1. boost::shared_ptr的用法 下面用一个简单的例子说明shared_ptr的用法: #include <stdio.h> #include <boost/shared_ptr.hpp> class A { public: void print() { printf("class A print!\n"); } }; int main(int argc, char **argv) { boost::shared_ptr<A> a1(new A()); a1->print(); } shared_ptr不用手动去释放资源,它会智能地在合适的时候去自动释放。如上面的例子,a1指向的对象将会在程序结束的时候自动释放(程序结束时所有申请的资源都会被释放,这只是为了说明其作用)。再来看下面的例子: //同上 int main(int argc, char **argv) { boost::shared_ptr<A> a1(new A()); a1->print(); printf("a1 reference count: %d\n", a1.use_count()); boost::shared_ptr<A> a2 = a1; printf("a1 reference count: %d\n", a1.use_count()); printf("a2 reference

智能指针

匿名 (未验证) 提交于 2019-12-03 00:33:02
C++98中的智能指针通过一个模板类 auto_ptr 来实现, new 操作符返回的指针可以交由它来管理,程序员不用再显式的调用 delete ,这在一定程度上避免了堆内存忘记释放的问题; 不过 auto_ptr 有一些缺点,比如拷贝时返回一个左值,不能调用delete[]等 。 C++11中废弃了 auto_ptr ,改用 unique_ptr、shared_ptr、weak_ptr 等智能指针来自动回收堆分配对象,使内存管理更安全,智能指针的使用场景也变得更全面。 unique_ptr是唯一性智能指针,无法进行复制,但是可以移动。而shared_ptr是共享性智能指针,采用引用计数,可以拷贝和移动,移动时引用计数不会变化。 Example #include <memory> #include <iostream> using namespace std; int main() { unique_ptr< int > up1( new int ( 11 )); unique_ptr< int > up2 = up1; //不能通过编译 cout << *up1 << endl; //11 unique_ptr< int > up3 = move(up1); //现在p3是数据唯一的unique_ptr智能指针 cout << *up3 << endl; //11 cout <<