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
查看全文
相关阅读:
Axure RP 8.0 中继器初体验
随便写的随机数生成器,目前并没有实现设置精度和去重功能
PHP向MySql中插入数据
php连接mysql数据库练手
C随便练练手的题
个人档案 7-5
个人档案
个人档案 7-4
个人档案 6-30
个人档案 6-29
原文地址:https://www.cnblogs.com/len3d/p/234612.html
最新文章
软件工程 2016.6.28 日报
软件工程个人总结
团队项目个人总结
设计模式——工厂模式浅析
UML动态模型图简单介绍
7-5组报
7-4小组日报
7.1-7.3
6-30项目发布
6.29项目发布
热门文章
6-29小组日报
6-28组报
6-27组报
团队项目发布
团队项目:即时聊天软件 需求分析、用例、UI原型
解决Scrapy抓取中文结果保存为文件时的编码问题
《亿人帮》与《新米公益》竞品分析报告(简要版)
屏幕焦点检测源代码
初学python(print使用、条件分支、循环、模块引用)
Axure原型用pmdaniu在线托管尝试
Copyright © 2011-2022 走看看