堆内存指针的管理类(禁,引数(指针copy),值copy,移)
//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,移)的更多相关文章
- C 堆内存管理
在Win32 程序中每个进程都占有4GB的虚拟地址空间,这4G的地址空间内部又被分为代码段,全局变量段堆段和栈段,栈内存由函数使用,用来存储函数内部的局部变量,而堆是由程序员自己申请与释放的,系统在管 ...
- 牛客网Java刷题知识点之内存的划分(寄存器、本地方法区、方法区、栈内存和堆内存)
不多说,直接上干货! 其中 1)程序计数器:用于指示当前线程所执行的字节码执行到了第几行,可以理解为当前线程的行号指示器.每个计数器志勇赖记录一个线程的行号,所以它是线程私有的. ...
- C/C++中程序在使用堆内存时的内存复用问题
在一个C/C++程序中,如果使用了堆内存的管理机制,那么内存究竟是怎么分配与回收的呢? 先看一个程序: #include <iostream> using namespace std; i ...
- Java 堆内存(Heap)[转]
将jvm内存很不错的文章,转自 堆(Heap)又被称为:优先队列(Priority Queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复 ...
- 干货:JVM 堆内存和非堆内存
堆和非堆内存 按照官方的说法:"Java 虚拟机具有一个堆(Heap),堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时创建的."" ...
- JDK8中JVM堆内存划分
一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址. JVM全部的对象信息都 存放在堆内存中.相比 ...
- JVM 堆内存和非堆内存
转载自:http://www.importnew.com/27645.html 堆和非堆内存 按照官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据区域,所有类实例和数组的内存均从此 ...
- 五、JVM之堆内存
堆结构分代图 堆结构分代的意义 Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代.老年代和永久代(对HotSpot虚拟机而言),这就是JVM的内存分代策略. 堆内存是虚拟机管理 ...
- js的栈内存和堆内存
栈内存和堆内存在了解一门语言底层数据结构上,挺重要的,做了个总结 JS中的栈内存堆内存 JS的内存空间分为栈(stack).堆(heap).池(一般也会归类为栈中). 其中栈存放变量,堆存放复杂对象, ...
随机推荐
- mysql 利用binlog增量备份,还原实例
mysql 利用binlog增量备份,还原实例 张映 发表于 2010-09-29 分类目录: mysql 标签:binlog, mysql, mysqldump, 增量备份 一,什么是增量备份 增量 ...
- win7无法通过DHCP获得IP地址
问题:win7无法通过DHCP获得IP地址(手动设置没有问题),但XP可以自动获取. 前些时候,某局域网反应部分WIN7系统无法正常从DHCP服务器(windows dhcp 服务器)获取ip地址,交 ...
- php中替换函数主要用的几个函数strtr(),str_repalce()。
php中替换函数主要有strtr(),str_repalce()这两个函数,今天介绍下他们的区别和用法, 先来看看这个php字符串替换函数 strtr()的两种用法: strtr(string,fro ...
- ubuntu-E:Encountered a section with no Package: header的解决办法
刚才打开ubuntu,我的版本是12.04.正想使用sudo apt-get install build-essential 时,出现了如下错误: E:Encountered a section wi ...
- js笔记---封装一般运动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 类型解释器——C专家编程读书笔记
对于声明,应该按下面的步骤来进行解释: 1) 声明从它的名字开始读取,然后按照优先级顺序依次读取 2) 优先级顺序 a) 括号括起来的部分 b) 后缀操作符,()表示函数,[]表示数组 c) 前缀操作 ...
- Epoll,Poll,Select模型比较
http://blog.csdn.net/liangyuannao/article/details/7776057 先说Select: 1.Socket数量限制:该模式可操作的Socket数由FD_S ...
- hdu 3826
Squarefree number Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- EasyUI DataGrid 添加排序
这个事例演示了如何在点击列头的时候排序DataGrid中全部的列可以通过点击列头被排序.你可以定义可以被排序的列.默认的,列不能被排序除非你设置sortable属性为TRUE,下面是例子:标记 < ...
- 2016年11月4日 星期五 --出埃及记 Exodus 19:20
2016年11月4日 星期五 --出埃及记 Exodus 19:20 The LORD descended to the top of Mount Sinai and called Moses to ...