关于类的成员变量指向在堆上的对象的选择:指针/auto_ptr<>/shared_ptr<> ?

在堆上的对象作为一个类的一个成员变量,我了解到的至少有三种方式(如下所示):

class A
{

}

class B
{
A* m_pA1;
auto_ptr m_pA2;
shared_ptr
m_pA3;

}

B::B()
:m_pA1(new A),m_pA2(auto_ptr(new A)),m_pA3(shared_ptr(new A))
{

}

针对这三种方案,在什么情况下选择哪种呢:下面是小弟的一些感悟,算是抛砖引玉
1、个人感觉和B的拷贝构造和赋值有关系,如果需要的是B的一个深拷贝,我会选择m_pA1;
2、auto_ptr的所有权剥夺性,使得他不适合拷贝构造和赋值;
3、shared_ptr
采用引用计数 觉得和m_pA1之间做选择还是有点纠结?
4、圆方,你怎么看?

c++
0

1个回答

一般使用就一
二淘汰了
三引用计数也狠多用,如果熟悉也可以

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++自动释放的指针之——auto_ptr和shared_ptr
假设我们使用一个用来塑模投资行为(例如股票、债券等)的程序库,其中各式各样的投资类型集成自一个root class Investment: class Investment { ... };//&quot;投资类型&quot;集成体系中的root class 进一步假设,这个程序库通过一个工厂模式供应我们某特定的Investment对象: Investment* createInvestment(); /...
三个智能指针auto_ptr、unique_ptr、shared_ptr之间的简单比较
三个智能指针auto_ptr、unique_ptr、shared_ptr之间的简单比较 三个智能指针位于头文件memory中。 auto_ptr由 C++98 提供,已被 C++11 抛弃。 类型 策略 能否用于数组 备注 auto_ptr 所有权模型 否 - unique_ptr 所有权模型 能 策略比auto_ptr更严格 shared_ptr 引用计数模型 否 -...
当shared_ptr指向“this”对象
     在学习boost.asio的时候遇到了enable_shared_from_this&amp;lt;&amp;gt;,它与shared_ptr指向“this”对象的情况有关,查阅资料后,我通过下面链接文章中的“special case”章节理解了它的作用。                       http://www.umich.edu/~eecs381/handouts/C++11_smart_p...
指向对象成员变量的指针
指向对象成员变量的指针
智能指针基础std::auto_ptr与new、delete的重载学习笔记
在C/C++中我们malloc/new申请的内存都要自行释放,除非程序结束,否则会造成内存泄漏,这么久以来分配释放已经成为一个习惯,但是有时候还是会有疏漏,忘记释放。而C++中有这么一类东西,它可以替我们释放不再使用且未手动释放的内存,这种所谓的东西就叫做智能指针。而智能指针有多种(std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::sc
c++中的智能指针auto_ptr解析
c++中的auto_ptr是一个类,却可以像指针一样去使用。使用auto_ptr需要包含头文件#include 例如:auto_ptr ps(new string("hello"));可以像指针一样去使用它,cout size() 引例: #include #include using namespace std; class A{ public: A(int x = 0) :m_
c++11智能指针解析——揭开底层面纱,完整理解智能指针
昨天跟同事小小的研究了下关于不同平台下,起因是遇到了一个坑,vs上没有问题,在安卓上却崩溃了。找了半天后发现是c++字节补齐问题,期间包括使用#pragma pack(1)来限定字节对齐方式等各种条件,也是把我们搞的七晕八素,总算是进一步了解了c++对象结构以及编译器的操作(有机会的话也补充下字节对齐的理解)。进而想到了智能指针,稍微了解下。第一次接触智能指针,天知道大学期间自己有多不努力,很多知
c++中智能指针auto_ptr与shared_ptr的使用方法
原文地址:http://blog.csdn.net/gui694278452/article/details/46348733 1. 简介 C++程序员最痛苦的莫过于对内存的管理,由于没有像C# 和 java的内存回收机制,C++程序员在复杂的程序中容易造成内存的泄露。即使程序员十分小心,异常的产生也有可能会造成部分内存的泄露(由于异常导致delete语句没有机会执行)。为了避免该问题,出
C++11智能指针(四):创建shared_ptr对象
1、尽量不要使用相同的原始指针来创建多个shared_ptr对象,因为在这种情况下,不同的shared_ptr对象不会知道它们与其他shared_ptr对象共享指针。这样会造成什么样的问题?设想两个shared指针由相同的原始指针创建:int *rawPtr = new int(); std::shared_ptr&amp;lt;int&amp;gt; ptr_1(rawPtr); std::shared_ptr...
C++11中使用std::share_ptr管理指向普通类型指针的动态数组时一点注意
参考文章:shared_ptr to an array : should it be used?在创建指向普通类型的动态数组时,需指定对应的删除函数如:template&amp;lt; typename T &amp;gt; struct array_deleter { void operator ()( T const * p) { delete[] p; } }; std::shar...
浅析shared_ptr 和weak_ptr、定制删除器
shared_ptr的作用如同指针,但又比指针更加安全,甚至还能提供基本的线程安全保证。记录了有多少个shared_ptrs共同指向一个对象(即引用计数),它基本上解决了在使用c++开发过程中不可避免的使用指针而遇到的许多问题,例如:内存泄漏和内存的提前释放,还有由于指针内存申请而产生的异常问题等。shared_ptr指针解决了auto_ptr和一旦最后一个这样的指针被销毁,也就是一旦某个对象的引
c++ 局部对象指针及到底是在堆上创建的对象还是在栈上创建的?
~~~~我的生活,我的点点滴滴!!
实现auto_ptr的两种方法
我们都知道,实现auto_ptr有两种方法:第一种方法:在上一篇博客中我已经实现了,主要思想是管理权转移。第二种方法:它是我们c++标准库中以前的一个版本,主要思想是在auto_ptr类中除了有一个指针的成员变量以外还有一个bool类型的成员变量_owner。构造函数中将_owner设为真,表示对象是指针所指向的内存的拥有者,当要赋值时(ap1=ap2),将ap1的_owner置为true,ap2
auto_ptr 与 shared_ptr 用法和区别总结
1.auto_ptr 被复制后,将失去原来所致资源的所有权;
C++智能指针shared_ptr的三种使用方式
智能指针通常是指基于引用计数的智能指针,在c++11标准中就是std::shared_ptr。它的特点是如果可以安全的放入STL容器中。 有以下三种方式可以使用shared_ptr 1. 如果你的c++编程环境支持c++标准,那么可以直接使用 std::shared_ptr,它定义在memory文件中。 2. 如果你的c++实现支持 C++TR1库扩展,那么可以使用 std::tr1::sh
【涨姿势】boost库中的智能指针向上转换
这里稍微解释下何谓指针类型的向下转换和向上转换。向下转换是指派生类指针转换为基类指针类型,向上转换是指基类指针类型转换为派生类类型。C++一般使用dynamic_cast转换符实现向上转换。智能指针可以毫无问题的进行向下类型转换,却不能使用dynamic_cast进行向上类型转换。例如: #include "boost/shared_ptr.hpp" class Base { publ
shared_ptr(共享指针)使用总结
背景介绍         最近在coding的时候遇到这样的问题,一个两层的map,hashmap>,重新加载时需要将这个map释放,但是这个map使用时是分为两段使用,一段是在hashmap中取出里面的map,第二段是在里层的map中查找key,这在多线程运行时有可能出现在取出里层map的引用后,重新加载数据并且释放掉现在的hashmap,这个场景引起了我对shared_ptr共享指针的关
C++智能指针auto_ptr的原理及使用
std::auto_ptr auto_ptr是C++标准库中()为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针) auto_ptr的实现原理其实就是RAII(Resource Application Immediately Initialize),在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。 使用auto_pt
c++,在class内部获得this指针的shared_ptr
在class内部,获得this指针的shared_ptr,需要class继承std::enable_shared_from_this,示例代码如下: #include &amp;lt;memory&amp;gt; #include &amp;lt;iostream&amp;gt; class SharedTest :public std::enable_shared_from_this&amp;lt;SharedTest&amp;gt; { ...
【C++/Boost Lib】如何初始化一个shared_ptr指针。
shared_ptr指针带有有参数的gouca
C++之指向数据成员的指针和指向成员函数的指针
这里指向数据成员的指针和指向成员函数的指针与指向变量的指针和指向函数的指针进行对比来解释,比较好理解一些。指向变量的指针和指向函数的指针先举个例子:void func(int a, int b){ cout << a << " " << b << endl; }int main() { int a = 10, b =20; int *p = &a; //指向变量a的指针
STL四种智能指针
STL一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr和weak_ptr,auto_ptr是C++98提供的解决方案,C+11已将将其摒弃,并提出了unique_ptr作为auto_ptr替代方案。虽然auto_ptr已被摒弃,但在实际项目中仍可使用,但建议使用较新的unique_ptr,因为unique_ptr比auto_ptr更加安全,后文会详细叙述。...
c++的成员变量是在堆还是栈区
成员变量并不能决定自身的存储空间位置。决定存储位置的对象的创建方式。即:如果对象是函数内的非静态局部变量,则对象,对象的成员变量保存在栈区。如果对象是全局变量,则对象,对象的成员变量保存在静态区。如果对象是函数内的静态局部变量,则对象,对象的成员变量保存在静态区。如果对象是new出来的,则对象,对象的成员变量保存在堆区。...
C++怎么用指针访问类中私有成员变量。
C++类中的私友成员是不能通指针操作的。但是总有方法可以做到。可以用: 类中Public 成员指针指向私友成员。 这时类外部的成员可以操作Public成员指针,间接的操作类私成员。#include &amp;lt;iostream&amp;gt; using namespace std; class A { int a;//private public : int b;//public void f1 ()...
C++类里面定义一个指向自己的静态成员指针变量(实现单例)
1、使用方法 我们在头文件中声明一个如下的类,定义一个指向该类自己的静态成员指针变量kpHttpClientInstance; class CHttpClient { public:       CHttpClient();     ~CHttpClient();     static CHttpClient* GetInstance();     int Init(const string...
成员变量在栈上还是堆上?
class CTest { public: int iCount; };iCount在栈上还是堆上取决于类对象的声明方式;如果是: CTest = new CTest(); 那么iCount在堆上;如果是: CTest cTest; 那么iCount在栈上;
关于含有指针成员的类的对象之间赋值指针的问题。
在C++ 中,当定义了一个类,类的成员中有指针的时候,需要注意:如果将类的对象A赋值给B的时候,两个对象的指针是指向同一个地址的,其余的变量都是相等的。在图像处理中,比如定义了一个图像类,类成员中有具体的图像数据,如果将两个对象直接相等,会使两个对象的数据指针指向同一个地址。如果要使两个对象的指向不同的地址可以为类定义一个函数,用于两个对象之间的直接赋值运算。下面以例子说明。         声
类的对象的定义以及指向类成员及成员方法的指针
一.对象定义 1.sizeof(class)给对象开辟内存 2.成员变量(成员对象)的初始换=》当前类的构造函数的初始化列表种指定 注意一点:成员变量(对象)的初始化顺序是:他们定义的顺序,而和初始化列表顺序无关 3 根据对象定义的方式,调整合适的构造函数 问题:有哪些成员变量必须在初始化列表中初始化: 1  引用的变量 2 const 常量 三种面向对象的成员方法: 一 类的普
C++对象指针数组与堆中对象数组
#include using namespace std; /*堆中对象数组、对象指针数组*/ class stu { public: void set(int x){i = x + 6;} int get(){return i*i;}; private: int i; }; void main() { const int n = 1000; stu * p = new stu[n];
c++——类对象和类指针(作用基本一样:都是为了调用类的成员变量和成员函数)
代码:1234567Student a; //实例化一个类对象as.setName(&quot;A&quot;); //Studeng *b = new Student();Student *b; //实例化一个类指针bb = new Student();b-&amp;gt;setName(&quot;B&quot;);分析:定义类对象基本格式是:Student a;在定义之后就已经为a这个对象分配了内存,且为内存栈;定义类指针基本格式是:St...
c++ 指向对象成员的指针
在c++中类是抽象的,没有实际内存,而对象是具体,是占有内存的,因此对象有地址,存放对象的起始地址的指针变量就是指向对象的指针变量。对象中的成员也是占有内存的,所以,存放对象成员的起始地址的指针变量就是指向对象成员的指针变量。1.指向对象数据成员的指针int *p1;   //定义指向整形数据的变量p1 = &amp;amp;t1.hour;     //把hour的地址赋给p1cout&amp;lt;&amp;lt;*...
关于动态分配vector指针和使用shared_ptr的vector指针
动态分配的vector指针 vector *get_num(int n) { vector *pv = new vector(n+1); int i , x; for(i = 0; i < n; i++) { cin>>x; (*pv)[i] = (x); } return pv; } 如果是动态分配的vector
【C++11新特性】 C++11智能指针之shared_ptr
C++中的智能指针首先出现在“准”标准库boost中。随着使用的人越来越多,为了让开发人员更方便、更安全的使用动态内存,C++11也引入了智能指针来管理动态对象。在新标准中,主要提供了shared_ptr、unique_ptr、weak_ptr三种不同类型的智能指针。接下来的几篇文章,我们就来总结一下这些智能指针的使用。今天,我们先来看看shared_ptr智能指针。
c++ 指向类成员的指针
定义类如下: class Foo{ public: static int getNum(); private: static int num; } 1、定义一个指针指向 类的数据成员 num int Foo::*p = &amp;amp;Foo::num 2、定义一个指针指向 类的成员函数 getNum() int (Foo::*pf)() = &amp;amp;Foo::getNum; ...
C++中的回调函数——指向类成员的指针
C++中的回调函数   ——指向类成员的指针 在C中我们能够很容易地实现一个指向函数的指针,因此能够方便地实现函数的回调机制。但是在C++中很多人认为类的成员函数不能作为回调函数,因此很多C程序不能移植到C++上来。其实不是这样的,在C++中我们同样可以获取类的成员函数的指针,也能方便地实现函数回调机制。 下面先数一下C/C++中普通函数作为回调函数的情况,然后再说C++ 中类成员函
C++11及C++14标准的智能指针
智能指针这个概念经常会碰见,而且面试的时候太经常会被问到了,特来总结一下。 C++11的智能指针及其背景 auto_ptr的坑点 C++11之前的智能指针是auto_ptr,一开始它的出现是为了解决指针没有释放导致的内存泄漏。比如忘了释放或者在释放之前,程序throw出错误,导致没有释放。所以auto_ptr在这个对象声明周期结束之后,自动调用其析构函数释放掉内存。 int t =
C++ Primer : 第十二章 : 动态内存之shared_ptr与new的结合使用、智能指针异常
shared_ptr与new的结合使用、智能指针异常
智能指针shared_ptr与unique_ptr详解
为什么使用动态内存 程序不知道自己需要多少对象; 程序不知道对象的准确类型; 程序需要在多个对象之间共享数据; 动态内存在哪里 程序有静态内存、栈内存。静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数内的非static对象。分配在静态或栈内存中的对象由编译器自动创建或销毁。对于栈对象,仅在其定义的程序块运行时才存在;s...
share_ptr 引用计数的实现
智能指针在c++标准库中提供了auto——ptr
类里面定义一个指向自己的静态成员指针变量
class a {  public:         void  printa() { cout  public:        static a* my; }
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 关于java类机器学习 java学习对象类