//[C++]智能指针auto_ptr简单的实现 #include <iostream> using namespace std; template <class _Ty> class auto_ptr { public: auto_ptr(_Ty *_P = 0) :_Owns(_Ptr != 0), _Ptr(_P) {} auto_ptr<_Ty>(const auto_ptr <_Ty> &p):_Owns(p._Owns),_Ptr(p.r…
智能指针(auto_ptr) 这个名字听起来很酷是不是?其实auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势,但也有其局限.本文总结的8个问题足以涵盖auto_ptr的大部分内容. 1. auto_ptr是什么? auto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被分给两个拥有者.当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对…
本文将简要介绍智能指针shared_ptr和unique_ptr,并简单实现基于引用计数的智能指针. 使用智能指针的缘由 1. 考虑下边的简单代码: int main() { ); ; } 就如上边程序,我们有可能一不小心就忘了释放掉已不再使用的内存,从而导致资源泄漏(resoure leak,在这里也就是内存泄漏). 2. 考虑另一简单代码: int main() { ); delete ptr; ; } 我们可能会心想,这下程序应该没问题了?可实际上程序还是有问题.上边程序虽然最后释放了申请…
转载:智能指针auto_ptr 很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生成健壮的代码.本文阐述了如何正确运用auto_ptr来让你的代码更加安全——以及如何避免对auto_ptr危险但常见的误用,这些误用会引发间断性发作.难以诊断的bug. 1.为什么称它为“自动”指针?auto_ptr只是众多可能的智能指针之一.许多商业库提供了更复杂的智能指针,用途广泛而令人惊异,从…
auto_ptr是C++标准库提供的类模板,头文件<memory>,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同一时候被分给两个拥有者.当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有的动态内存自己主动释放. 即使发生异常,通过异常的栈展开过程也能将动态内存释放.auto_ptr不支持new数组. auto_ptr的出现,主要是为了解决"有异常抛出时发生内存泄漏"的问题.例如以下的简单代码是这类问…
面试的时候,我们经常会被问到如何自己动手实现智能指针auto_ptr.今天我就一边参考STL库中的源代码,一边将auto_ptr的实现敲一遍. auto_ptr归根到底是一个模版类,那么这个类要实现哪些功能呢?如下: /* 一个智能指针应该有以下操作: 1.Auto_ptr<T> ap;      //创建名为ap的为绑定Auto_ptr对象 2.Auto_ptr<T> ap(p);   //创建 ap 的Auto_ptr对象,ap用友指针 p 指向的对象.该构造函数为explic…
template<class T> class auto_ptr { public: ); // Item M5 有“explicitfor”// 的描述 template<class U> // 拷贝构造函数成员模板 auto_ptr(auto_ptr<U>& rhs); // (见Item M28): // 用另一个类型兼容的 // auto_ptr对象 // 初始化一个新的auto_ptr对象 ~auto_ptr(); template<class…
智能指针auto_ptr和shared_ptr也是面试中经常被问到的一个 感觉看auto_ptr的源码反而更加容易理解一些,因为源码的代码量并不大,而且比较容易理解. 本篇主要介绍auto_ptr 其特点如下: 1.首先auto_ptr智能指针是个封装好的类: 2.是采用栈上的指针去管理堆上的内容,所以auto_ptr所管理的对象必须是new出来的,也不能是malloc出来的, 原因:在auto_ptr的实现机制中,采用的是delete 掉一个指针,该delete一方面是调用了指针所指对象的析构…
实际上auto_ptr 仅仅是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势.使用它不必每次都手动调用delete去释放内存.当然有利也有弊,也不是全然完美的. 本文从以下的8个方面来总结auto_ptr使用的大部分内容. 1. auto_ptr是什么? auto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同一时候被分给两个这样拥有者(auto_ptr). 当auto_ptr…
C++智能指针 auto_ptr auto_ptr 是一个轻量级的智能指针, 定义于 memory (非memory.h)中, 命名空间为 std. auto_ptr 适合用来管理生命周期比较短或者不会被远距离传递的动态对象, 最好是局限于某个函数内部或者是某个类的内部. 使用方法: std::auto_ptr<int> pt(new int(10)); pt.reset(new int(11)); 成员函数 3个重要的函数: (1) get 获得内部对象的指针, 由于已经重载了()方法, 因…
<More Effective C++>ITEM M9他提到auto_ptr.说是当异常产生的时候.怎么释放为对象分配的堆内存,避免反复编写内存释放语句. PS:这里书里面提到函数退出问题,函数退出会清理栈内存,无论是怎么正常退出还是异常退出(仅有一种例外就是当你调用 longjmp 时.Longjmp 的这个缺点是 C++领先支持异常处理的主要原因).建立在此基础上我们才把对指针的删除操作封装到一个栈对象里面. 这样函数退出(异常或是正常)就会调用对象的析构函数,达到我们自己主动清理所封装指…
首先,如果你不知道什么是智能指针,请先移步:C++智能指针简单剖析 1.auto_ptr #ifndef AUTO_PTR_H #define AUTO_PTR_H template<typename T> class auto_ptr { public : //使用explicit关键字避免隐式转换 ); ~auto_ptr(); //使用另一个类型兼容的auto_ptr来初始化一个新的auto_ptr template<typename U> auto_ptr(auto_ptr…
C++的动态内存的分配与释放是个挺折磨人的事情,尤其异常分支复杂时(比如一堆try catch中,各catch里需要做delete 掉相关的堆上分配的内存),极有可能产生内存泄露的情况.C++中提供了智能指针作为可选的解决方案, C++标准库中自带的智能指针是auto_ptr,它在大多数场景下是满足需求的.针对auto_ptr的缺点,boost和loki两套库都扩展出一些智能指针,并且boost中有两位幸运儿入选了tr1中(std::tr1::shared_ptr,std::tr1::weak_…
本文参考C++智能指针简单剖析 内存泄露 我们知道一个对象(变量)的生命周期结束的时候, 会自动释放掉其占用的内存(例如局部变量在包含它的第一个括号结束的时候自动释放掉内存) int main () { { int a = 1; printf("%d\n", a); } { a = 2; printf("%d\n", a); } } 这样会编译错误. 但是如果这样写呢? void func(int &o) { int *p = new int(o); ret…
什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源.避免泄漏的惯用法. RAII又叫做资源分配即初始化,即:定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 为什么要使用RAII? 在计算机系统中,资源是数量有限且对系统正常运行具有一定作用的元素.比如:网络套接字.互斥锁.文件句柄和内存等等,它们属于系统资源.由于系统的资源是有限的…
一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作.具体而言,复制对象时,副本和原对象都指向同一存储区域,如果通过一个副本改变其所指的值,则通过另一对象访问的值也会改变.所不同的是,智能指针能够对内存进行进行自动管理,避免出现悬垂指针等情况. 2.普通指针存在的问题 C语言.C++语言没有自…
1. auto_ptr 的设计动机: 函数操作经常依照下列模式进行: 获取一些资源 执行一些动作 释放所获取的资源 那么面对这些资源的释放问题就会出现下面的两种情况: 一开始获得的资源被绑定于局部对象,那么当函数退出的时候,这些局部对象的析构函数被自动的调用,从而自动释放掉这些资源; 一开始获得的资源是通过某种显示手段获取,而且并没有绑定在任何对象身上,那么必须以显式的方式释放.这种情况常常发生在指针身上; 例子: void f() { ClassA* ptr = new ClassA(); .…
auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象.auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时,动态分配的对象会被自动释放.auto_ptr为动态分配内存提供了大量的便利和安全性.通过使用auto_ptr,程序员不再需要关心new出来的对象何时delete,而且在子程序异常跳出时仍能保证动态分配的对象正常析构. 在使用auto_ptr之前,必须包含以下的头文件: #include<memory…
手写代码是理解C++的最好办法,以几个例子说明C++四个智能指针的用法,转载请注明出处. 一.auto_ptr auto_ptr这是C++98标准下的智能指针,现在常常已经被C++标准的其他智能指针取代.它的缺点是在转移所有权后会使运行期不安全.C++11新标准,用unique_ptr来代替auto_ptr原有功能,其用法介绍见第四部分unique_ptr. #include <iostream> #include <memory> #include <string>…
#include <iostream> #include <memory> #include <string> #include <vector> using namespace std; struct my { int x; int y; }; //智能指针主要用于解决内存泄漏,拥有常规指针一样的使用,重载* ->运算符 void run1() { //void *p = malloc(1024 * 1024 * 100); //智能指针,检测到没有…
本文为转载:https://www.cnblogs.com/zeppelin5/p/10083597.html,对作者有些地方做了修正. 手写代码是理解C++的最好办法,以几个例子说明C++四个智能指针的用法,转载请注明出处. 一.auto_ptr auto_ptr这是C++98标准下的智能指针,现在常常已经被C++标准的其他智能指针取代.它的缺点是在转移所有权后会使运行期不安全.C++11新标准,用unique_ptr来代替auto_ptr原有功能,其用法介绍见第四部分unique_ptr.…
C++ 关于拷贝控制和资源管理部分的笔记,并且介绍了部分C++ 智能指针的概念,然后实现了一个基于引用计数的智能指针.关于C++智能指针部分,后面会有专门的研究. 通常,管理类外资源的类必须定义拷贝控制成员.为了定义这些成员,我们首先必须确定此对象的拷贝语义.一般来讲,有两种选择: 使类的行为看起来像一个值 类的行为像一个值:意味着它有自己的状态.当我们拷贝一个像值的对象时,副本和原对象是完全对立的.改变副本不会对对原对象有任何影响.反之亦然. 使类的行为看起来像一个指针 行为像指针的类则共享状…
智能指针的用处:在c++中,使用普通指针容易造成堆内存的泄露问题,即程序员会忘记释放,以及二次释放,程序发生异常时内存泄漏等问题,而使用智能指针可以更好的管理堆内存.注意,在这里智能指针是一个类而非真正的指针,只是对一个真正的指针进行包装,代理原指针.通过操作符的重载,可以让智能指针和真正的指针有类似的操作. 如何实现:在智能指针析构函数当中,可以对代理的原指针进行delete以及赋空指针等操作,智能指针销毁时,自动调用析构函数,省去了程序员自己管理指针的操作.当多个智能指针代理同一个指针时,我…
#include <memory>//shared_ptr要用的头文件 using namespace std; class A //测试auto_ptr和shared_ptr的delete能力 { public: A(){ cout << 'A' << endl; } ~A(){ cout << "~A" << endl; } }; int main() { // int *a = new int(3); // auto_p…
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造成内存泄露, 有时我们已经非常谨慎了 , 然防不胜防:流程太复杂,程序员忘记 delete:异常导致程序过早退出,没有执行delete的情况屡见不鲜. void FunTest() { ]; FILE* pFile = fopen("1. txt", "w"); if…
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造成内存泄露, 有时我们已经非常谨慎了 , 然防不胜防:流程太复杂,程序员忘记 delete:异常导致程序过早退出,没有执行delete的情况屡见不鲜. void FunTest() { ]; FILE* pFile = fopen("1. txt", "w"); if…
1.智能指针背后的设计思想 我们先来看一个简单的例子: void remodel(std::string & str) { std::string * ps = new std::string(str); ... if (weird_thing()) throw exception(); str = *ps; delete ps; return; } 当出现异常时(weird_thing()返回true),delete将不被执行,因此将导致内存泄露. 如何避免这种问题?有人会说,这还不简单,直接…
C++中指针申请和释放内存通常采用的方式是new和delete.然而标准C++中还有一个强大的模版类就是auto_ptr,它可以在你不用的时候自动帮你释放内存.下面简单说一下用法. 用法一: std::auto_ptr<MyClass>m_example(new MyClass()); 用法二: std::auto_ptr<MyClass>m_example; m_example.reset(new MyClass()); 用法三(指针的赋值操作): std::auto_ptr&l…
简介 C++没有内存自动回收机制,对堆内存的管理就是简单的new和delete,每次new出来的内存都需要手动delete释放.但由于忘记.流程复杂或者异常退出等,都有可能导致没有执行delete释放内存,造成内存泄漏. 在实际工程中,我们往往希望将精力放在应用层上而不是费劲心思处理语言的细枝末节(内存释放),于是就有了最原始的智能指针auto_ptr. 智能指针原理 智能指针是一种资源管理类,这个类在构造函数中传入一个原始指针,在析构函数中释放传入的指针.智能指针都是栈上的对象,所以当函数(或…
一.前序 什么是智能指针? ——是一个类,用来存储指针(指向动态分配对象也就是堆中对象的的指针). c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的delete语句就返回了,如果我们不在每一个可能跳转或者返回的语句前释放资源,就会造成内存泄露.使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会…