//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. MYSQL的主从和主主复制模式

    一.复制介绍 MySQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录 ...

  2. PHP自定义函数格式化json数据怎么调用?

    <?php/*** Formats a JSON string for pretty printing** @param string $json The JSON to make pretty ...

  3. JavaEE基础(十八)/集合

    1.集合框架(Map集合概述和特点) A:Map接口概述 查看API可以知道: 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 B:Map接口和Collection接口的不同 ...

  4. poj1811 Prime Test

    http://poj.org/problem?id=1811 #include <cstdio> #include <cstring> #include <algorit ...

  5. CRB and His Birthday(背包)

    CRB and His Birthday Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...

  6. A Plug for UNIX 分类: POJ 图论 函数 2015-08-10 14:18 2人阅读 评论(0) 收藏

    A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14786 Accepted: 4994 Desc ...

  7. 选择轮廓(select_shape)

    选择轮廓(select_shape)     Halcon是一款运用广泛的图像识别和处理软件.在肤浅的接触中,它的轮廓选择算子(select_shape)给予我很深的印象.结果是往往几行代码就能够产生 ...

  8. VRRP配置与维护手册-1

    http://www.gpxz.com/diannao/hulianwang/80526.html 一  VRRP简介< xmlnamespace prefix ="o" n ...

  9. ural 1115,搜索

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1115 题意:n个军舰,m个海岸线,各个长度给出,求n个军舰怎么组成这些海岸线. 思路很简 ...

  10. Tomcat优化总结

    一.内存溢出问题 Linux设置启动脚本 [root@LAMP ~]# vi /usr/local/tomcat/bin/catalina.sh #__________________________ ...