//copyp
template<typename T>
class pm_copyP{
public:
pm_copyP(T* _p);
pm_copyP(const pm_copyP&);
pm_copyP& operator=(const pm_copyP&);
~pm_copyP();
T* getP()const;
static int mmout;
private:
pm_copyP();
T* myp;
int * count_ref;
del();
}; template<typename T>
pm_copyP<T>::pm_copyP(T* _p):myp(_p),count_ref(new int()){++mmout;} template<typename T>
pm_copyP<T>::pm_copyP(const pm_copyP& _pm)
{
myp=_pm.myp;
count_ref=_pm.count_ref;
int* temp=count_ref;
++(*temp);
} template<typename T>
pm_copyP<T>& pm_copyP<T>::operator=(const pm_copyP& _pm)
{
if(&_pm!=this)
{
     ++(*_pm.count_ref);//这里很危险,刚发现。就算不是自我赋值,有可能,这个类是一个包含自身职能指针的类。删除本身,又会调用里面的析构,刚好析构是参数呢?所以必须放到第一行。
        del();
myp=_pm.myp;
count_ref=_pm.count_ref;
}
return *this;
} template<typename T>
pm_copyP<T>::~pm_copyP()
{
del();
} template<typename T>
pm_copyP<T>::del()
{
--(*count_ref);
if(*count_ref==)
{
--mmout;
delete myp;
delete count_ref;
myp=;
count_ref=;
}
} template<typename T>
T* pm_copyP<T>::getP()const
{
return myp;
} template<typename T>
class pm_forbidP{
public:
pm_forbidP(T* _p);
~pm_forbidP();
T* getP();
private:
T* myp;
pm_forbidP();
pm_forbidP(const pm_forbidP&);
pm_forbidP& operator=(const pm_forbidP&);
}; template<typename T>
pm_forbidP<T>::pm_forbidP(T* _p):myp(_p){} template<typename T>
T* pm_forbidP<T>::getP()
{
return myp;
} template<typename T>
pm_forbidP<T>::~pm_forbidP()
{
delete myp;
} template<typename T>
class pm_copyValue{
public:
pm_copyValue(T* _p);
pm_copyValue(const pm_copyValue&);
pm_copyValue& operator=(const pm_copyValue&);
~pm_copyValue();
T* getP();
private:
pm_copyValue();
T* myp;
void del();
}; template<typename T>
pm_copyValue<T>::pm_copyValue(T* _p):myp(_p){} template<typename T>
pm_copyValue<T>::pm_copyValue(const pm_copyValue& _pm):myp(new T(*_pm.myp)){} template<typename T>
pm_copyValue<T>& pm_copyValue<T>::operator=(const pm_copyValue& _pm)
{
if(&_pm!=this)
{
del();
myp=new T(*_pm.myp);
}
return *this;
} template<typename T>
pm_copyValue<T>::~pm_copyValue()
{
del();
} template<typename T>
void pm_copyValue<T>::del()
{
delete myp;
} template<typename T>
T* pm_copyValue<T>::getP()
{
return myp;
} template<typename T>
class pm_transforP{
public:
pm_transforP(T* _p);
pm_transforP(pm_transforP&);
pm_transforP& operator=(pm_transforP&);
~pm_transforP();
T* getP();
private:
T* myp;
void del();
pm_transforP();
}; template<typename T>
pm_transforP<T>::pm_transforP(T* _p):myp(_p){} template<typename T>
pm_transforP<T>::pm_transforP(pm_transforP& _pm):myp(_pm.myp)
{
_pm.myp=;//const 怎么可以修改.
} template<typename T>
pm_transforP<T>& pm_transforP<T>::operator=(pm_transforP& _pm)
{
if(this!=&_pm)
{
del();
myp=_pm.myp;
_pm.myp=;//const 怎么可以修改.
}
return *this;
} template<typename T>
pm_transforP<T>::~pm_transforP()
{
del();
} template<typename T>
void pm_transforP<T>::del()
{
if(myp!=)
{
delete myp;
}
} template<typename T>
T* pm_transforP<T>::getP()
{
return myp;
}

堆内存指针的管理类(禁,引数(指针copy),值copy,移)的更多相关文章

  1. C 堆内存管理

    在Win32 程序中每个进程都占有4GB的虚拟地址空间,这4G的地址空间内部又被分为代码段,全局变量段堆段和栈段,栈内存由函数使用,用来存储函数内部的局部变量,而堆是由程序员自己申请与释放的,系统在管 ...

  2. 牛客网Java刷题知识点之内存的划分(寄存器、本地方法区、方法区、栈内存和堆内存)

    不多说,直接上干货!  其中        1)程序计数器:用于指示当前线程所执行的字节码执行到了第几行,可以理解为当前线程的行号指示器.每个计数器志勇赖记录一个线程的行号,所以它是线程私有的.    ...

  3. C/C++中程序在使用堆内存时的内存复用问题

    在一个C/C++程序中,如果使用了堆内存的管理机制,那么内存究竟是怎么分配与回收的呢? 先看一个程序: #include <iostream> using namespace std; i ...

  4. Java 堆内存(Heap)[转]

    将jvm内存很不错的文章,转自 堆(Heap)又被称为:优先队列(Priority Queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复 ...

  5. 干货:JVM 堆内存和非堆内存

    堆和非堆内存 按照官方的说法:"Java 虚拟机具有一个堆(Heap),堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时创建的."" ...

  6. JDK8中JVM堆内存划分

    一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址. JVM全部的对象信息都 存放在堆内存中.相比 ...

  7. JVM 堆内存和非堆内存

    转载自:http://www.importnew.com/27645.html 堆和非堆内存 按照官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据区域,所有类实例和数组的内存均从此 ...

  8. 五、JVM之堆内存

    堆结构分代图 堆结构分代的意义 Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代.老年代和永久代(对HotSpot虚拟机而言),这就是JVM的内存分代策略. 堆内存是虚拟机管理 ...

  9. js的栈内存和堆内存

    栈内存和堆内存在了解一门语言底层数据结构上,挺重要的,做了个总结 JS中的栈内存堆内存 JS的内存空间分为栈(stack).堆(heap).池(一般也会归类为栈中). 其中栈存放变量,堆存放复杂对象, ...

随机推荐

  1. Base Enum Properties [AX 2012]

    Base Enum Properties [AX 2012] This topic has not yet been rated - Rate this topic Updated: December ...

  2. VPS常用工具

    1.命令行工具 putty 在Mac下,可以直接使用超级终端 ssh username@ipaddress 2.可视化上传文件工具 WinSCP 在Mac下,使用 Cyberduck

  3. Hibernate,JPA注解@ManyToMany_JoinTable

    可以通过@ManyToMany注解可定义的多对多关联.同时,也需要通过注解@JoinTable描述关联表和关联条件.如果是双向关联,其中一段必须定义为owner,另一端必须定义为inverse(在对关 ...

  4. sqlite3内存不断增加的原因

    数据库是这样设计的:用内存保存数据,以提高增删查改的速度,同时把数据写入磁盘,让数据落地. 如果不删除数据库里的数据,随着数据不断地添加到数据库,数据库越来越大,RES内存也越来越大. 见测试代码a. ...

  5. Function对象属性和方法

    /* var pattern = /^[\w]+\.(zip|rar|gz)$/; //|选择符必须用分组符号包含起来 var str = '123.7z'; alert(pattern.test(s ...

  6. js的动态加载、缓存、更新以及复用

    使用范围: OA.MIS.ERP等信息管理类的项目,暂时不考虑网站. 遇到的问题: 完成一个项目,往往需要引用很多js文件,比如jQuery.js.easyUI等.还有自己写的一些列js文件,那么这些 ...

  7. [BIM]案例

    以下是中建三局BIM小组的项目,用以参考: BIM协同设计与质量控制 现实建筑物实体都是以三维空间状态存在,若用三维设计表达更具有优势.如复杂管综设计,一般情况下,二维AutoCAD设计是在建筑.结构 ...

  8. miniUI子窗口调父窗口方法

    window.Owner.XXX 其中XXX是父窗口里的方法名

  9. 2016年10月29日 星期六 --出埃及记 Exodus 19:14

    2016年10月29日 星期六 --出埃及记 Exodus 19:14 After Moses had gone down the mountain to the people, he consecr ...

  10. context是什么意思

    context上下文吗,可以解释为程序运行的某一区间之内,提供对这一区间之内操作的一种对象,而且往往这一区间之内得核心操作都需要这个对象来进行 把Context翻译成“上下文”只是不直观罢了,不过也没 ...