zoukankan
html css js c++ java
自己写的智能指针源码
//
-------------------------------------------------
//
Smart Pointer
//
-------------------------------------------------
#ifndef _SMART_POINTER_H
#define
_SMART_POINTER_H
extern
std::list
<
short
>
ptrCounter;
template
<
class
T
>
class
smartPtr
{
private
:
T
*
ptr;
short
*
counter;
#ifdef _DEBUG
#define
_DEBUG_FILE_NAME_LEN 32
#define
_DEBUG_RECORD_LEN 32
typedef
struct
__debug_record
{
char
file[_DEBUG_FILE_NAME_LEN];
int
line;
}
debug_record;
public
:
debug_record ptr_changed_rec[_DEBUG_RECORD_LEN];
int
ptr_changed_time;
#endif
//
_DEBUG
public
:
#ifdef _DEBUG
smartPtr(LPCSTR file
=
"
Construction By Default
"
,
int
line
=
__LINE__)
{
#else
smartPtr()
{
#endif
//
_DEBUG
ptr
=
new
T;
ptrCounter.push_back(
1
);
counter
=
&
ptrCounter.back();
#ifdef _DEBUG
memset(ptr_changed_rec,
0
,
sizeof
(debug_record)
*
_DEBUG_RECORD_LEN);
strncpy(ptr_changed_rec[
0
].file,file,_DEBUG_FILE_NAME_LEN);
ptr_changed_rec[
0
].line
=
line;
ptr_changed_time
=
1
;
#endif
//
_DEBUG
}
#ifdef _DEBUG
smartPtr(
const
T
*
np,LPCSTR file
=
"
Construction By Pointer
"
,
int
line
=
__LINE__)
{
#else
smartPtr(
const
T
*
np)
{
#endif
//
_DEBUG
ptr
=
const_cast
<
T
*>
(np);
ptrCounter.push_back(
1
);
counter
=
&
ptrCounter.back();
#ifdef _DEBUG
memset(ptr_changed_rec,
0
,
sizeof
(debug_record)
*
_DEBUG_RECORD_LEN);
strncpy(ptr_changed_rec[
0
].file,file,_DEBUG_FILE_NAME_LEN);
ptr_changed_rec[
0
].line
=
line;
ptr_changed_time
=
1
;
#endif
//
_DEBUG
}
smartPtr(
const
smartPtr
<
T
>
&
np)
{
ptr
=
np.ptr;
counter
=
np.counter;
(
*
counter)
++
;
#ifdef _DEBUG
LPCSTR file
=
"
Construction By Copying
"
;
int
line
=
__LINE__;
memset(ptr_changed_rec,
0
,
sizeof
(debug_record)
*
_DEBUG_RECORD_LEN);
strncpy(ptr_changed_rec[
0
].file,file,_DEBUG_FILE_NAME_LEN);
ptr_changed_rec[
0
].line
=
line;
ptr_changed_time
=
1
;
#endif
//
_DEBUG
}
void
operator
=
(
const
smartPtr
<
T
>
&
np)
{
if
(counter
!=
NULL)
{
(
*
counter)
--
;
if
((
*
counter)
<=
0
)
delete ptr;
}
ptr
=
np.ptr;
counter
=
np.counter;
(
*
counter)
++
;
#ifdef _DEBUG
LPCSTR file
=
"
Value Assignment
"
;
int
line
=
__LINE__;
strncpy(ptr_changed_rec[ptr_changed_time].file,file,_DEBUG_FILE_NAME_LEN);
ptr_changed_rec[ptr_changed_time].line
=
line;
ptr_changed_time
++
;
#endif
//
_DEBUG
}
~
smartPtr()
{
(
*
counter)
--
;
if
((
*
counter)
<=
0
)
delete ptr;
}
T
*
operator
->
()
{
return
ptr;
}
T
*
real()
{
return
ptr;
}
}
;
#endif
//
_SMART_POINTER_H
查看全文
相关阅读:
AndroidUI组件之ListView小技巧
iframe属性參数
Applet 数字签名技术全然攻略
SoftReference
递归算法浅谈
VS2010 打包生成exe文件后 执行安装文件出现 TODO:<文件说明>已停止工作并已关闭
创建新的Cocos2dx 3.0项目并解决一些编译问题
ORACLE触发器具体解释
SRM 624 D2L3: GameOfSegments, 博弈论,Sprague–Grundy theorem,Nimber
cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法
原文地址:https://www.cnblogs.com/len3d/p/234612.html
最新文章
CoInitialize浅析一
SimpleDateFormat使用具体解释
Opencv学习笔记(六)SURF学习笔记
vi 命令 使用方法
[MySQL] MySQL的自己主动化安装部署
HTML里面Textarea换行总结
GridView编辑删除操作
关闭对话框,OnClose和OnCancel
逻辑回归
spring 整合JDBC
热门文章
extern用法总结!
MP算法和OMP算法及其思想
GridView控件
在Eclipse中怎样公布创建的JavaWebproject
院士的幻想与国产操作系统泡沫
程序猿有趣的面试智力题
MfC 进度条控件
抢车位中的排名bug(比較使用了无符号数)
一个非常好用的中文语音播报接口
ProgressDialog使用总结
Copyright © 2011-2022 走看看