关于类的成员变量指向在堆上的对象的选择:指针/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的使用方法
原文地址:http://blog.csdn.net/gui694278452/article/details/46348733rnrn1. 简介rnC++程序员最痛苦的莫过于对内存的管理,由于没有像C# 和 java的内存回收机制,C++程序员在复杂的程序中容易造成内存的泄露。即使程序员十分小心,异常的产生也有可能会造成部分内存的泄露(由于异常导致delete语句没有机会执行)。为了避免该问题,出
三个智能指针auto_ptr、unique_ptr、shared_ptr之间的简单比较
三个智能指针auto_ptr、unique_ptr、shared_ptr之间的简单比较nn三个智能指针位于头文件memory中。nauto_ptr由 C++98 提供,已被 C++11 抛弃。nnnnnn类型n策略n能否用于数组n备注nnnnnauto_ptrn所有权模型n否n-nnnunique_ptrn所有权模型n能n策略比auto_ptr更严格nnnshared_ptrn引用计数模型n否n-...
当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...
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++中的智能指针auto_ptr解析
c++中的auto_ptr是一个类,却可以像指针一样去使用。使用auto_ptr需要包含头文件#include n例如:auto_ptr ps(new string("hello"));可以像指针一样去使用它,cout size()n引例:n#include n#include nusing namespace std;nnclass A{npublic:n A(int x = 0) :m_
智能指针基础std::auto_ptr与new、delete的重载学习笔记
在C/C++中我们malloc/new申请的内存都要自行释放,除非程序结束,否则会造成内存泄漏,这么久以来分配释放已经成为一个习惯,但是有时候还是会有疏漏,忘记释放。而C++中有这么一类东西,它可以替我们释放不再使用且未手动释放的内存,这种所谓的东西就叫做智能指针。而智能指针有多种(std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::sc
C++11智能指针(四):创建shared_ptr对象
1、尽量不要使用相同的原始指针来创建多个shared_ptr对象,因为在这种情况下,不同的shared_ptr对象不会知道它们与其他shared_ptr对象共享指针。这样会造成什么样的问题?设想两个shared指针由相同的原始指针创建:int *rawPtr = new int();nstd::shared_ptr&amp;lt;int&amp;gt; ptr_1(rawPtr);nstd::shared_ptr...
C++智能指针auto_ptr使用讲解
auto_ptr是C++98标准库提供的一个智能指针,但已被C++11明确声明不再支持。nauto_ptr具有以下缺陷:nnauto_ptr有拷贝语义,拷贝后源对象变得无效,这可能引发很严重的问题;而unique_ptr则无拷贝语义,但提供了移动语义,这样的错误不再可能发生,因为很明显必须使用std::move()进行转移。nn#include &amp;lt;iostream&amp;gt;n#include ...
Auto_ptr被废弃的原因
n n n 因为它可能导致对同一块堆空间进行多次delete。n当两个智能指针都指向同一个堆空间时,每个智能指针都会delete一下这个堆空间,这会导致未定义行为。n针对这个问题有3种策略:n1、进行深度复制,有几个指针就复制几个对象;n2、制定指针专有权的概念。即,只有一个智能指针能真正指向一个特定的对象,也只有该指针能析构这个对象所占用的空间,直到把这个指针赋给另...
C++智能指针shared_ptr的三种使用方式
智能指针通常是指基于引用计数的智能指针,在c++11标准中就是std::shared_ptr。它的特点是如果可以安全的放入STL容器中。rn有以下三种方式可以使用shared_ptrrn1. 如果你的c++编程环境支持c++标准,那么可以直接使用 std::shared_ptr,它定义在memory文件中。rn2. 如果你的c++实现支持 C++TR1库扩展,那么可以使用 std::tr1::sh
类的对象的定义以及指向类成员及成员方法的指针
一.对象定义n1.sizeof(class)给对象开辟内存n2.成员变量(成员对象)的初始换=》当前类的构造函数的初始化列表种指定n注意一点:成员变量(对象)的初始化顺序是:他们定义的顺序,而和初始化列表顺序无关n3 根据对象定义的方式,调整合适的构造函数n问题:有哪些成员变量必须在初始化列表中初始化:n1  引用的变量n2 const 常量n三种面向对象的成员方法:n一 类的普
c++11智能指针解析——揭开底层面纱,完整理解智能指针
昨天跟同事小小的研究了下关于不同平台下,起因是遇到了一个坑,vs上没有问题,在安卓上却崩溃了。找了半天后发现是c++字节补齐问题,期间包括使用#pragma pack(1)来限定字节对齐方式等各种条件,也是把我们搞的七晕八素,总算是进一步了解了c++对象结构以及编译器的操作(有机会的话也补充下字节对齐的理解)。进而想到了智能指针,稍微了解下。第一次接触智能指针,天知道大学期间自己有多不努力,很多知
C++之指向数据成员的指针和指向成员函数的指针
这里指向数据成员的指针和指向成员函数的指针与指向变量的指针和指向函数的指针进行对比来解释,比较好理解一些。指向变量的指针和指向函数的指针先举个例子:void func(int a, int b){n cout << a << " " << b << endl;n}int main()n{n int a = 10, b =20;n int *p = &a; //指向变量a的指针
C++类里面定义一个指向自己的静态成员指针变量(实现单例)
1、使用方法nn我们在头文件中声明一个如下的类,定义一个指向该类自己的静态成员指针变量kpHttpClientInstance;nnclass CHttpClientn{npublic:nn      CHttpClient();n    ~CHttpClient();n    static CHttpClient* GetInstance();n    int Init(const string...
指向对象成员变量的指针和指向成员函数的指针
1.指向对象成员变量的指针:rn形式:  数据类型名 * 指针变量名rn定义了一个指针,指向对象的成员变量rn   实例:rn               Stu.h                                                                                        Stu stu:rnint *p=&(stu.age);/
C++怎么用指针访问类中私有成员变量。
C++类中的私友成员是不能通指针操作的。但是总有方法可以做到。可以用: 类中Public 成员指针指向私友成员。 这时类外部的成员可以操作Public成员指针,间接的操作类私成员。#include &amp;lt;iostream&amp;gt;nusing namespace std;nclass An{n int a;//privatenpublic :n int b;//publicn void f1 ()...
c++ shared_ptr 智能指针循环引用问题
智能指针的循环引用nnshared_ptr and weak_ptr differencesnn“循环引用”简单来说就是:两个对象互相使用一个shared_ptr成员变量指向对方的会造成循环引用。导致引用计数失效。下面给段代码来说明循环引用:nnnn#include&amp;lt;iostream&amp;gt;n#include &amp;lt;memory&amp;gt;nusing namespace std;nclass...
c++,在class内部获得this指针的shared_ptr
在class内部,获得this指针的shared_ptr,需要class继承std::enable_shared_from_this,示例代码如下:n#include &amp;lt;memory&amp;gt;n#include &amp;lt;iostream&amp;gt;nnclass SharedTest :public std::enable_shared_from_this&amp;lt;SharedTest&amp;gt;n{n...
C++智能指针shared_ptr讲解与使用
手动管理的弊端rn在简单的程序中,我们不大可能忘记释放 new 出来的指针,但是随着程序规模的增大,我们忘了 delete 的概率也随之增大。在 C++ 中 new 出来的指针,赋值意味着引用的传递,当赋值运算符同时展现出“值拷贝”和“引用传递”两种截然不同的语义时,就很容易导致“内存泄漏”。rn手动管理内存带来的更严重的问题是,内存究竟要由谁来分配和释放呢?指针的赋值将同一对象的引用散播到程序各处,...
浅析shared_ptr 和weak_ptr、定制删除器
shared_ptr的作用如同指针,但又比指针更加安全,甚至还能提供基本的线程安全保证。记录了有多少个shared_ptrs共同指向一个对象(即引用计数),它基本上解决了在使用c++开发过程中不可避免的使用指针而遇到的许多问题,例如:内存泄漏和内存的提前释放,还有由于指针内存申请而产生的异常问题等。shared_ptr指针解决了auto_ptr和一旦最后一个这样的指针被销毁,也就是一旦某个对象的引
c++ 指向对象成员的指针
在c++中类是抽象的,没有实际内存,而对象是具体,是占有内存的,因此对象有地址,存放对象的起始地址的指针变量就是指向对象的指针变量。对象中的成员也是占有内存的,所以,存放对象成员的起始地址的指针变量就是指向对象成员的指针变量。1.指向对象数据成员的指针int *p1;   //定义指向整形数据的变量p1 = &amp;amp;t1.hour;     //把hour的地址赋给p1cout&amp;lt;&amp;lt;*...
关于含有指针成员的类的对象之间赋值指针的问题。
在C++ 中,当定义了一个类,类的成员中有指针的时候,需要注意:如果将类的对象A赋值给B的时候,两个对象的指针是指向同一个地址的,其余的变量都是相等的。在图像处理中,比如定义了一个图像类,类成员中有具体的图像数据,如果将两个对象直接相等,会使两个对象的数据指针指向同一个地址。如果要使两个对象的指向不同的地址可以为类定义一个函数,用于两个对象之间的直接赋值运算。下面以例子说明。n        声
成员变量在栈上还是堆上?
class CTest n{ npublic: n int iCount; n};iCount在栈上还是堆上取决于类对象的声明方式;如果是: nCTest = new CTest(); n那么iCount在堆上;如果是: nCTest cTest; n那么iCount在栈上;
c++中指向对象的指针为NULL时可以调用对象成员函数吗
问题貌似有点奇怪,指针都为NULL了怎么还可使用?但其实不是的,可以看以下代码:nnn#include &amp;lt;iostream&amp;gt;n using namespace std;n n class A n {n public:n void showSth();n };n int main()n {n A *a1 = NULL;n a1-&amp;gt;showSt...
【C++11新特性】 C++11智能指针之shared_ptr
C++中的智能指针首先出现在“准”标准库boost中。随着使用的人越来越多,为了让开发人员更方便、更安全的使用动态内存,C++11也引入了智能指针来管理动态对象。在新标准中,主要提供了shared_ptr、unique_ptr、weak_ptr三种不同类型的智能指针。接下来的几篇文章,我们就来总结一下这些智能指针的使用。今天,我们先来看看shared_ptr智能指针。
C++11及C++14标准的智能指针
智能指针这个概念经常会碰见,而且面试的时候太经常会被问到了,特来总结一下。nnnC++11的智能指针及其背景nnnnauto_ptr的坑点nnC++11之前的智能指针是auto_ptr,一开始它的出现是为了解决指针没有释放导致的内存泄漏。比如忘了释放或者在释放之前,程序throw出错误,导致没有释放。所以auto_ptr在这个对象声明周期结束之后,自动调用其析构函数释放掉内存。nnint t =
C++中指向子类的父类指针访问父、子类成员时的权限和函数隐藏规则
/*指向子类对象的父类指针访问父、子类成员的权限问题*/n/* 继承中:使用指向对象的指针访问类成员时与使用对象直接访问类成员的访问权限和成员隐藏情况是不一样的。n ··使用对象直接访问成员时,继承来的子父类成员都可以访问;子父类中有同名成员时,子类一定覆盖父类。··n ··使用指向子类的父类指针时,只可直接访问的是父类成员,基类成员函数前加virtual且子类中有同名函数时才会使用子
shared_ptr智能指针模板类的简单实现(c++11)
前言n 最近突然萌生把stl常用的库都通通自己过一遍的想法,算是对泛型编程的一次学习,也深入理解stl,还是对c++11知识的练习,就从智能指针开始吧。 n 另外,c++11让c++程序变得简洁优雅了许多,对这门语言有点爱不释手了。n智能指针原理n 通过使用引用计数的方式来自动的对动态申请的内存进行释放,保证指针的生存期和安全性。 n 对智能指针初始化的时候,会将引用计数初始为1,之后每次拷
this 指针的地址--调用成员函数的所在对象的起始地址
#includenusing namespace std;nclass Testn{n int x;n public:n Test(int a){n x=a;n }n void get_this();n};nvoid Test:: get_this()n{n cout<<"this points to"<<this<<endl;n}nint main()n{n Test obj(12);n c
对象指针为NULL,为什么还是可以调用成员函数
C++中,空指针是不能够使用的,然而空对象指针有时候却能够调用成员函数。n先来看一下以下程序:n#includen#includenusing namespace std;nclass An{npublic:n static void f1(){ cout<<"f1"<<endl; }n void f2(){ cout<<"f2"<<endl; }n void f3(){ c
C++11 智能指针之 std::shared_ptr 初级学习
shared_ptr概念nshared_ptr基于“引用计数”模型实现,多个shared_ptr可指向同一个动态对象,并维护了一个共享的引用计数器,记录了引用同一对象的shared_ptr实例的数量。当最后一个指向动态对象的shared_ptr销毁时,会自动销毁其所指对象(通过delete操作符)。nshared_ptr的默认能力是管理动态内存,但支持自定义的Deleter以实现个性化的资源释放动作
C++智能指针的用法auto_ptr和unique_ptr
需要引入头文件memoryauto_ptr和unique_ptr都会自动delete内存,把堆开辟内存当做栈使用
C++用指针访问private 成员
//rn//  main.cpprn//  使用指针访问类中的私有变量rn//rn//  Created by 就不告诉你我是谁 on 15-7-25.rn//  Copyright (c) 2015年 xuqigang. All rights reserved.rn//rn#include rnusing namespace std;rnclass Class1{rnpublic:rn    C
C++总结2—shared_ptr交叉引用及多线程安全问题
智能指针是存储指向动态分配对象指针的类,用于生存期控制;能够确保正确销毁动态分配的内存,防止内存泄露。本博文参考博客https://blog.csdn.net/yusiguyuan/article/details/40628805nn(1)智能指针的分类nn1.不带引用计数的智能指针auto_ptr 、unique_ptr、 scoped_ptrnn2.带引用计数的智能指针shared_ptr强智...
c++中指向类数据成员的指针
首先提出几个问题:1、怎么获得数据成员的偏移量?rn2、如果类中有虚函数,类的布局是怎么样?vptr是放在对象内存的开始处还是结尾处,还是什么地方?(当然具体的编译器实现不同)rn在这里在vs2010上进行几个简单的测试rn测试例子1rnPoint3d.h文件#pragma oncenclass Point3dn{npublic:n Point3d(void);n ~Point3d(void);n
c++ 容器中管理存放继承类对象的智能指针
需求:nn多种继承类/子类 对象共同存放于容器中, 要求能push进不同对象,pop出来后能实现多态。nn实现分析:nn这种情况就得容器中存放基类指针,但是存放指针就意味着得自己管理内存,主动释放。 有没有方法让c++自己去管理呢,答案是用智能指针。nn示例代码: 容器中存放的是unique_ptr, pop出来后可以转成shared_ptr给外界去调用。超级方便nnn#include &amp;lt;s...
对用父类指针(或引用)指向父类对象和子类对象时,从而用父类指针或者引用访问成员时的深刻理解;
赋值兼容规则永远不变,父类指针既可以指向父类对象,也可以指向子类对象;当父类指针指向父类对象时,访问父类的成员;当父类指针指向子类对象时,那么只能访问子类中从父类继承下来的那部分成员;不能访问子类独有的成员,如果访问,编译阶段会报错;函数隐藏(将父类的成员隐藏,通过子类对象或者在子类内部只能访问子类的同名成员;但是父类的成员仍然存在),是指当子类中有和父类同名的成员变量时,此时子类中有两个名字相同的
如何用auto_ptr做为函数的参数进行传递
auto_ptr跟指针的原理是一样的,只不过在使用会自动释放内存。但是在函数中作为auto_ptr参数使用时,一定要注意控制权的转移问题。nnnvoid testptrAddNumber(MCMDTLog* mmcLog)n{n mmcLog-&amp;gt;addNumber();n}nnnvoid func(auto_ptr&amp;lt;int&amp;gt;&amp;amp; ap)n{n cout &amp;lt;...
C++如何声明类成员函数指针或类成员变量指针(A::*)
例如有如下类,class An{n int mem;n int* func(void)n {n //...n }n};怎么声明类A的成员函数指针或成员变量指针呢?int* (A::*func_ptr) (void) = &A::func;nint A::*obj_ptr = &A::mem;上面声明了指向成员函数func的函数指针,和指向成员变量mem的变量指针
详解this指针--为什么空的对象指针可以调用成员函数
引题class A{npublic:n void function()n {n cout << "I can run" << endl;n }n};int main()n{n A* pa = NULL;n pa->function();n system("pause");n return 0;n}C++中,空指针是不能够使用的,然而空对象指针有
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 关于java类机器学习 java学习对象类