♣ 题目部分 在Oracle中,如何在不执行SQL的情况下获取执行计划? ♣ 答案部分 1、“EXPLAIN PLAN FOR SQL”不实际执行SQL语句,生成的计划未必是真实执行的计划。...2、SQL*Plus的AUTOTRACE功能,命令:SET AUTOTRACE TRACEONLY EXPLAIN。...除SET AUTOTRACE TRACEONLY EXPLAIN外其它的AUTOTRACE方式均实际执行SQL。...但是,如果该命令后执行的是DML语句,那么该DML语句是确实被Oracle实际执行过的。 本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。
动态内存的使用很容易出问题。有时我们会忘记释放内存,在这种情况下就会产生内存泄漏;有时在尚有指针引用内存的情况下我们就释放了它,在这种情况下就会产生引用非法内存的指针。...weak_ptr,弱引用,不控制所指向对象的生存期,指向 shared_ptr所管理的对象。 默认初始化的 shared_ptr对象是一个空指针,在使用之前需要进行初始化。...一个例子就是将 shared_ptr存放于一个容器中,而后不再需要全部元素,而只是使用其中一部分,要记得掉用容器的 erase操作删除不再需要的元素。...对于 shared_ptr类模板,删除器是类模板的 function数据成员,可以通过拷贝构造函数或 reset函数进行更改。...objT, fcn); weak_ptr,不控制所指向对象生存期的智能指针,指向由一个 shared_ptr管理的对象。
delete 接受一个动态对象的指针,销毁对象并释放相关内存 动态内存的管理十分困难,有时候会忘记释放内存,这种情况下会产生内存泄漏。...有时在尚有指针引用内存的情况下我们就释放了它,在这种情况下就会产生引用非法内存的指针。 为了更容易也更安全的使用动态内存,新的标准提供了两种智能指针类型来管理动态对象。...在这种情况下应该确保使用earse删除某些不再需要的shared_ptr 元素 直接管理内存 相对与智能指针直接使用new 和 delete很容器出错。...对于一块内存只有在没有任何智能指针指向它的情况下,智能指针才会自动释放它 shared_ptr 和 new 结合使用 接受指针参数的智能指针构造函数是 explicit 的。...我们也可以重载一个unique_ptr 中默认的删除器。但是unique_ptr 管理删除器的方式与shared_ptr 不同。
,标准库在头文件memory中定义了两个智能指针:允许多个指针指向同个对象的shared_ptr,指针独占对象的unique_ptr,还有一个伴随的弱引用指针weak_ptr。...智能指针的操作并不复杂,归功于C++强大的自定义能力,除了初始化之外很多时候操作与内置指针相同的。...,且此对象的参数必须时一个该类型元素的指针 // 自定义的删除器函数,常常用来处理那些由工厂产生的对象,如各种connection void newDeleteFun(int* inp) {...delete应只用在动态数组首指针,用在其他的指针上都是未定义的 动态数组一样可以由unique_ptr来管理,我们也一样可用下标访问其中元素 但是shared_ptr不直接支持管理动态数组,当用shared_ptr...管理时我们需要提供自己的删除器且不能用下标访问元素而是需要用get得到内置指针来访问 处于灵活性的考虑,有时候我们希望能得到一块连续内存但先不初始化它,此时我们可以用allocator类来处理,而且大多数时候我们用它分配动态数组可以得到更高的效率并更好管理
这种管理方式有两个问题: 如果我们忘记释放内存,就会造成内存泄漏 如果在有指针引用内存的情况下我们就释放它,就会出现“野指针” 新标准库提供了三种智能指针smart pointer: shared_ptr...有一种常见的例子是: 你将shared_ptr存放在一个容器之中,随后重排了容器不再需要某些元素。在这种情况下,你应该使用erase删除那些不再需要的shared_ptr元素。...= nullptr; // 指出p不再绑定任何对象 // 这时候q变成“空悬指针”,查找指向相同内存的所有指针是异常困难的 2.3 shared_ptr和new结合使用 如果我们不初始化一个智能指针...如果我们不用另一个智能指针来保存release返回的指针,我们就要负责资源的释放: p2.release(); // 错误:p2不会释放内存,而且我们丢失了指针 auto p = p2.release...return ret; } 类似于shared_ptr,unique_ptr默认情况下使用delete释放它指向的对象,我们重载一个删除器,但是unique_ptr管理删除器的方式和shared_ptr
在C++中,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存...动态内存管理经常会出现两种问题:一种是忘记释放内存,会造成内存泄漏;一种是尚有指针引用内存的情况下就释放了它,就会产生引用非法内存的指针。...如果你将shared_ptr存放于一个容器中,而后不再需要全部元素,而只使用其中一部分,要记得用erase删除不再需要的那些元素。...动态内存的一个基本问题是可能多个指针指向相同的内存 shared_ptr和new结合使用 如果我们不初始化一个智能指针,它就会被初始化成一个空指针,接受指针参数的职能指针是explicit的,因此我们不能将一个内置指针隐式转换为一个智能指针...用unique_ptr传递删除器 unique_ptr默认使用delete释放它指向的对象,我们可以重载一个unique_ptr中默认的删除器 我们必须在尖括号中unique_ptr指向类型之后提供删除器类型
/a.out x = 0y = 1 3 类型转换 这里只描述自定义类的类型转换,不涉及如算数运算的类型自动提升等。...operator type()在条件运算中,可以进行隐式转换,这就是为什么C++中的智能指针如shared_ptr的operator bool()加了explicit还能直接进行条件判断的原因。...shared_ptr的内存结构如下图所示,包含了两个指针:一个指向其所指的对象,一个指向控制块内存。...但是make_shared并不是万能的,如不能指定自定义删除器,此时可以先创建shared_ptr对象再传递到函数中。...默认情况下,unique_ptr有着几乎和裸指针一样的内存开销和指令开销,可以替代使用裸指针低开销的场景。
众所周知,C#和java中不需要开发人员自己释放内存,对象引用计数为零后.Net和Java虚拟机会对对象进行自动回收,从而防止内存泄露;但是C++语言中,在堆上分配的内存必须自己去管理,不用的时候要自己释放...1.2 获取原始指针 代码中可以使用get方法获取原始指针,如代码所示: int main () { int* p = new int (10); std::shared_ptr a...运行结果如下: a and p point to the same location 10 10 10 1.3 指定指针删除器 智能指针在初始化时可以指定删除器,在指针计数为零时,自动调用指定的删除器从而释放指针指向的内存存...,删除器可以是一个函数,也可以是一个lambda表达式,如代码所示: void DeletePoint(int *p){ delete p; } int main(){ std::shared_ptr...弱指针除了上面描述的功能外,在shared_ptr返回this指针的实现中也是使用了弱指针的方法才得以实现,同理,在解决循环引用的问题时,只需要将两个类中的任意一个类的成员使用弱指针,循环引用导致的内存泄露问题都可以顺利解决
这三种类型都定义在memeory头文件中。 原理: 将我们分配的动态内存都交给有生命周期的对象来处理,当对象过期时,让它的析构函数删除指向的内存。...//多数情况下没必要,都主动释放了,那么我们使用智能指针的意义在哪呢?...release返回的指针通常被用来初始化另一个智能指针或给另一个智能指针赋值。在本例中,管理内存的责任简单地从一个指针转给了另一个。...但是如果我们不用另一个智能指针来保存release返回的指针,我们的程序就要负责资源的释放。 p2.release();//错误,p2不会释放内存,而且我们丢失了指针。... sp5(new T(), D()); //定义shared_ptr,指向类型为T的对象,接受一个D类型的删除器,使用D删除器来释放内存 数组对象的管理: shared_ptr
对于特定的对象,只能有一个智能指针可拥有,这样只有拥有对象的智能指针的构造函数会删除该对象。然后让赋值操作转让所有权。...shared_ptr 和 weak_ptr shared_ptr 是目前工程内使用最多最广泛的智能指针,它使用引用计数实现对同一块内存的多个引用,在最后一个引用被释放时,指向的内存才释放,这也是和 unique_ptr...after leave the scope, crash 禁止使用指向 shared_ptr 的裸指针,也就是智能指针的指针,这听起来就很奇怪,但开发中我们还需要注意,使用 shared_ptr 的指针指向一个...这样的情况包括: 有一个指针数组,并使用一些辅助指针来标示特定的元素,如最大的元素和最小的元素; 两个对象包含都指向第三个对象的指针; STL 容器包含指针。...可以将 unique_ptr 存储到 STL 容器中,只要不调用将一个 unique_ptr 复制或赋给另一个的算法(如 sort())。例如,可在程序中使用类似于下面的代码段。
前言 在现代 c + + 编程中,标准库包含 智能指针,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。...shared_ptr shared_ptr 类型是 C++ 标准库中的一个智能指针,是为多个所有者可能必须管理对象在内存中的生命周期的方案设计的。...我简单的总结下就是:将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求),并在析构函数里编写delete语句删除指针指向的内存空间。...但是,你可以使用 weak_ptr 来尝试获取用于初始化的的新副本 shared_ptr 。 如果已删除内存,则的 bool 运算符将 weak_ptr 返回 false 。...这样的情况包括: 有一个指针数组,并使用一些辅助指针来标示特定的元素,如最大的元素和最小的元素; 两个对象包含都指向第三个对象的指针; STL容器包含指针。
并且这些智能指针的实现是参照boost中的实现的。 1.3 为什么需要智能指针 1.3.1 内存泄漏 我们在讲为什么之前先来了解一下什么是内存泄漏。...内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现 内存泄漏会导致响应越来越慢,最终卡死。...,在异常的重新抛出与捕获中,可以用智能指针解决。...智能指针的众多版本 C++中存在4种智能指针:auto_ptr,unquie_ptr,shared_ptr,weak_ptr,他们各有优缺点,以及对应的实用场景。...当shared_ptr对象的生命周期结束时就会调用传入的删除器完成资源的释放,调用该删除器时会将shared_ptr管理的资源作为参数进行传入。
为了解决循环引用导致的内存泄漏,引入了弱指针weak_ptr,weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象....,如: shared_ptr p = pa->pb_.lock(); p->print(); 补充:智能指针泄露问题 当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效...把类A里面的shared_ptr pb_,改为weak_ptr pb_即可 12、野指针 野指针就是指向一个已删除的对象或者所指向的空间是访问受限的空间的指针。...15、虚函数与纯虚函数 定义一个函数为虚函数,不代表该函数没有被实现,而是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。...在基类中实现纯虚函数的方法是在函数原型后加“=0” 如:virtual void funtion1()=0 如果A中的virtual去掉以后,以上的结果将会是A的foo 16、为什么析构函数必须是虚函数
在现代 C + + 编程中,标准库包含智能指针,智能指针可处理对其拥有的内存的分配和删除,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。...资源(堆内存、文件句柄、套接字等)应由对象“拥有”。 该对象在其构造函数中创建或接收新分配的资源,并在其析构函数中将此资源删除。...该指针最常用的情况是单例模式和编译防火墙的封装。 如果非要抬杠,使用 get() 函数获取到裸指针给另外一个裸指针,那么你使用智能指针的意义又何在呢?...所托管的指针都指向同一块内存空间。...此函数的速度更快,导致内存碎片更少,但在一次分配时不存在异常,而不是在另一种分配上。 通过使引用对象和更新智能指针中的引用计数的代码具有的更好的地址来提高性能。
//指向int的listif(p1 && p1->empty())*p1="h1"; 二、make_shared函数 最安全的分配和使用动态内存的方法就是调用该函数 此函数在内存中动态分配对象并初始化,...此函数的设计情况:我们需要向不能使用智能指针的代码传递一个内置指针 get函数将内存的访问权限传递给一个指针,但是之后代码不会delete该内存的情况下,对get函数的使用才是最安全的 永远不要用get...但是我们可以使用shared_prt的语法来指定删除器函数,那么在shared_ptr生命周期结束时就会自动调用这个函数 演示案例: 下面演示一个shared_ptr指定删除器函数以及避免内存泄露的案例...//使用这个连接//当f函数退出或者异常退出,p都会调用end_connection函数} 十二、shared_prt与动态数组的使用 与unique_ptr不同,shared_ptr不直接支持管理动态数组...如果希望使用shared_ptr管理动态数组,必须提供自己定义的删除器 如果未提供删除器,shared_ptr默认使用delete删除动态数组,此时delete少一个“[]”,因为会产生错误 //本例中
①unique_ptr 在C++中,unique_ptr是一个智能指针(smart pointer)类模板,用于管理动态分配的内存资源,它提供了自动释放内存的功能。...可自定义删除器:unique_ptr可以通过模板参数来指定一个删除器(deleter)函数对象,用于在释放内存时执行额外的清理操作。...②shared_ptr 在C++中,shared_ptr是一个智能指针(smart pointer)类模板,用于管理动态分配的内存资源。...这种情况下,每个对象的引用计数都不会变为0,导致内存泄漏。 具体来说,当两个对象相互持有shared_ptr时,它们的引用计数始终大于0,因此它们所指向的内存块永远不会被释放。...解决循环引用问题:由于 weak_ptr 不增加引用计数,可以用于解决两个或多个对象之间的循环引用问题,避免内存泄漏。
:为了解决shared_ptr的循环引用问题,不参与计数引用。...的定制删除器 为什么需要定制删除器呢??...+11和boost中智能指针的关系及发展历史 1....内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。...总结一下:内存泄漏非常常见,解决方案分为两种:1、事前预防型。如智能指针等。2、事后查错型。如泄漏检测工具。
5.智能指针(shared_ptr和make_shared) 我在刷题的时候,由于是参考了JAVA版的,在JAVA中可以靠JVM的垃圾回收机制,特别是考虑到大数据问题,在栈区建立一个链表或者树结构可能会导致空间不够...即使new和delete已经比C中的分配内存方便多了,但还是繁琐,因此我们可以使用智能指针来让程序自动维护开辟的空间!以防止由于我们不当操作出现内存泄露和野指针的问题!...在C++11中,智能指针包含在中,分为shared_ptr、unique_ptr、weak_ptr,其中shared_ptr允许多个指针指向同一个对象,而unique_ptr为独占式的占有一个对象...当有一个新的shared_ptr指向同一个对象时(复制shared_ptr等),引用计数加1。当shared_ptr离开作用域时,引用计数减1。当引用计数为0时,释放所管理的内存。...由于shared_ptr是一个类模板,因此不可以直接使用指针对其进行赋值!但一般不建议使用new方法对智能指针初始化,这样会造成阅读代码的困惑!建议使用make_shared函数进行初始化!
它适用于存储一系列相关的字符串或整数,例如在哈希表或列表中存储多个键值对。 它是一种可变的数据结构,可以在不创建新节点的情况下修改节点的值。...8、C++中shared_ptr和unique_ptr的区别与联系(unique_ptr只有一个,shared_ptr可以共享) 内存管理方式: unique_ptr:独占式智能指针,它“独占”所指向的对象...性能开销: shared_ptr由于需要维护引用计数,因此在某些情况下可能比unique_ptr有更大的性能开销。...但是,这种开销在大多数情况下可以忽略不计,除非在极端情况下需要频繁地创建和销毁智能指针。 使用场景: unique_ptr适用于独占某个资源的情况,例如一个动态分配的内存块只能被一个指针所管理。...shared_ptr适用于多个指针共享同一个资源的情况,例如多个指针指向同一个动态分配的数组或对象。
processWidget 中可以使用智能指针来动态分配其需要处理的 Widget 。...tr1::shared_ptr 的构造函数中包含了一个 explicit 的裸指针,于是便不存在从“ new Widget ”语句返回的裸指针到 processWidget 所需的 tr1::shared_ptr...在这种情况下,由于“ new Widget ”返回的指针不会如我们所愿保存在 tr1::shared_ptr 中,因此它很有可能会丢失,于是内存泄漏就发生了。...由于这段改进的代码中,“ new Widget ”语句以及对 tr1::shared_ptr 的构造函数的调用在单独的语句中,对 priority 的调用在另一个单独的语句中,所以编译器就没有机会调换处理顺序了...牢记在心 在单独的语句中使用智能指针来保存由new创建的对象。如果不这样做,你的程序会在抛出异常时发生资源泄漏。
领取专属 10元无门槛券
手把手带您无忧上云