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
查看全文
相关阅读:
【JS基础】数组
【JS基础】循环
【JS基础】DOM操作
移动端字体
【JQ基础】
【JS基础】
WebBrowser.DocumentText引发FileNotFound异常
抽取网络信息进行数据挖掘 建立语料库
文本分类和聚类有什么区别?
C# 读取网页源代码
原文地址:https://www.cnblogs.com/len3d/p/234612.html
最新文章
字符串串联聚合专用解决方案
解决 idea 运行 Spring Boot 项目启动慢的问题
连 JetBrains 都在劝你用正版软件
剑指 Offer —— 数组中重复的数字
Nginx learning —— 简单了解 Nginx 及其配置文件
Linux 文件权限
云服务器初始化配置 CentOS 7
Mac 必备软件
自定义注解、使用反射操作注解
MySQL 5.6 优化点(MRR、BKA 与 ICP)
热门文章
谷歌浏览器实用插件推荐
android流量监控
Java线程池初探
下定决心写博!
Parcelable接口的使用
android聊天软件的实现
[Android]ListView控件之Adapter性能优化
【JQ基础】DOM操作
【JQ基础】数组
JQ常用代码
Copyright © 2011-2022 走看看