堆内存指针的管理类(禁,引数(指针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).池(一般也会归类为栈中). 其中栈存放变量,堆存放复杂对象, ...
随机推荐
- 【jqGrid for ASP.NET MVC Documentation】.学习笔记.1.介绍
1 介绍 jqGrid for ASP.NET MVC 是一个服务端组件. 专为MVC 分隔 model ,view , controller 的原则,完全观察者模式 非常快的速度 仅仅很 ...
- Oracle 临时表
一.临时表的介绍: Oracle的临时表只存在于某个会话或者事物的生命周期里,此时临时表中的数据只对当前这个会话可见. 临时表经常被用于存放一个操作的中间数据(数据处理的中间环节). 临时表由于不产生 ...
- 织梦系统中出现DedeTag Engine Create File False提示原因及解决方法
今天更新网站时dedecms系统时,遇到一个问题:DedeTag Engine Create File False 出现这样的提示. 其实这也不算是什么错误,我个人觉得最重要的一点就是根目录下没有给 ...
- jQuery添加删除元素
$(document).ready(function () { $('#radioExtranet').on('click', function () { showProjectInformation ...
- HDU 5950:Recursive sequence(矩阵快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:给出 a,b,n,递推出 f(n) = f(n-1) + f(n-2) * 2 + n ^ 4. f ...
- 2015-11-04 asp.net 弹出式日历控件 选择日期 Calendar控件
html代码: <%@ Page Language="C#" CodeFile="calendar.aspx.cs" Inherits="cal ...
- 20150618_Andriod _KSOAP2_多线程
参考地址:http://blog.csdn.net/long704480904/article/details/8636734 webService:基于SOAP协议的远程调用标准,通过webServ ...
- Java基础知识点
以下10点为JAVA 基础知识,后面将足以总结和完善以备面试 数据类型 (包装类,字符串,数组) 异常处理 Java IO和NIO 数据结构 (集合和容器 ) 多线程(并发) 网络通信(协议) 面向对 ...
- ural 1115,搜索
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1115 题意:n个军舰,m个海岸线,各个长度给出,求n个军舰怎么组成这些海岸线. 思路很简 ...
- 2016CCPC东北地区大学生程序设计竞赛 1003 HDU5924
链接http://acm.hdu.edu.cn/showproblem.php?pid=5924 题意:根据公式求C,D 解法:打表找规律 #include <bits/stdc++.h> ...