社区
C++ 语言
帖子详情
一个类似于Java的GC功能的指针.
ookook
2003-12-12 04:26:05
今日编了一个类似于Java的GC功能的指针.与大家分享:如下
...全文
38
15
打赏
收藏
一个类似于Java的GC功能的指针.
今日编了一个类似于Java的GC功能的指针.与大家分享:如下
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Darkay_Lee
2004-03-14
打赏
举报
回复
开个站点好好研究讨论一下吧,这里不方便讨论
Hmilu
2004-03-08
打赏
举报
回复
Mark/
learn it later
Tommy
2004-01-19
打赏
举报
回复
和boost::shared_ptr有什么区别吗?看起来是通过引用计数起作用的,并不是真正的GC。
通过引用计数的话,如楼上说的,会有对象环的问题,就是A对象中有指向B对象的指针,B对象中也有指向A对象的指针,这时候,两个对象互相引用,所以大家的计数都是1,都不会释放。在boost中,是引用了一个弱指针weak_ptr来解决这个问题的。
lubin59
2004-01-19
打赏
举报
回复
好长的一段,
dfwid
2004-01-17
打赏
举报
回复
mark
oyd
2004-01-08
打赏
举报
回复
假的
zengpan_panpan
2004-01-07
打赏
举报
回复
只要有引用计数就不是GC,对象环无法释放。
ookook
2003-12-23
打赏
举报
回复
共两部分
一个类似于Java的GC功能的指针.(一)
http://expert.csdn.net/Expert/topic/2557/2557623.xml?temp=.2687494
一个类似于Java的GC功能的指针.(二)
http://expert.csdn.net/Expert/topic/2557/2557679.xml?temp=.4401514
qhgary
2003-12-19
打赏
举报
回复
mark
Jinhao
2003-12-19
打赏
举报
回复
先Mark,再研究
i_jianyong
2003-12-19
打赏
举报
回复
mark
ckacka
2003-12-19
打赏
举报
回复
mark
ookook
2003-12-12
打赏
举报
回复
//GarbageCollect.h文件(第三部分)
_GC_Y<_C>& operator ++ ()
{
#ifdef _DEBUG
if (NULL != m_pBaseClass && ++m_uiOffset == m_pBaseClass->m_uiSize)
{
--m_uiOffset;
_UpperLimit_ErrMessage();
}
#else
NULL != m_pBaseClass && ++m_uiOffset == m_pBaseClass->m_uiSize && --m_uiOffset;
#endif
return *this;
}
_GC_Y<_C> operator ++ (int)
{
_GC_Y<_C> Temp = *this;
#ifdef _DEBUG
if (NULL != m_pBaseClass && ++m_uiOffset == m_pBaseClass->m_uiSize)
{
m_uiOffset--;
_UpperLimit_ErrMessage();
}
#else
NULL != m_pBaseClass && ++m_uiOffset == m_pBaseClass->m_uiSize && m_uiOffset--;
#endif
return Temp;
}
_GC_Y<_C>& operator -- ()
{
#ifdef _DEBUG
if (NULL != m_pBaseClass && 0 == m_uiOffset--)
{
++m_uiOffset;
_LowerLimit_ErrMessage();
}
#else
NULL != m_pBaseClass && (0 == m_uiOffset || --m_uiOffset);
#endif
return *this;
}
_GC_Y<_C> operator -- (int)
{
_GC_Y<_C> Temp = *this;
#ifdef _DEBUG
if (NULL != m_pBaseClass && 0 == m_uiOffset--)
{
m_uiOffset++;
_LowerLimit_ErrMessage();
}
#else
NULL != m_pBaseClass && (0 == m_uiOffset || m_uiOffset--);
#endif
return Temp;
}
_GC_Y<_C>& operator += (const int iIncrement)
{
if (NULL != m_pBaseClass)
if (iIncrement >0)
if (m_pBaseClass->m_uiSize-1 - m_uiOffset >= (unsigned int)iIncrement)
m_uiOffset += iIncrement;
else
{
m_uiOffset = m_pBaseClass->m_uiSize-1;
_UpperLimit_ErrMessage();
}
else
if (m_uiOffset >= (unsigned int)-iIncrement)
m_uiOffset += iIncrement;
else
{
m_uiOffset = 0;
_LowerLimit_ErrMessage();
}
return *this;
}
/*
_GC_Y<_C>& operator -= (int iDecrement)
{
if (NULL != m_pBaseClass)
if (iDecrement > 0)
if (m_uiOffset >= (unsigned int)iDecrement)
m_uiOffset -= iDecrement;
else
{
m_uiOffset = 0;
_LowerLimit_ErrMessage();
}
else
if (m_pBaseClass->m_uiSize-1 - m_uiOffset >= (unsigned int)-iDecrement)
m_uiOffset -= iDecrement;
else
{
m_uiOffset = m_pBaseClass->m_uiSize-1;
_UpperLimit_ErrMessage();
}
return *this;
}
*/
_GC_Y<_C>& operator -= (const int iDecrement)
{
return *this += -iDecrement;
}
_C& operator * ()
{
//这个地方在Release版本中内存分配失败时存在问题(不过发生几率很小,约为%0.01)
_GC_ASSERT(NULL != m_pBaseClass);
return *(m_pBaseClass->m_pBuf + m_uiOffset);
}
_C& operator [] (int iOffset)
{
//这个地方在Release版本中内存分配失败时存在问题(不过发生几率很小,约为%0.01)
_GC_ASSERT(NULL != m_pBaseClass);
if (iOffset >0)
if (m_pBaseClass->m_uiSize-1 - m_uiOffset >= (unsigned int)iOffset)
iOffset = m_uiOffset + iOffset;
else
{
iOffset = m_pBaseClass->m_uiSize-1;
_UpperLimit_ErrMessage();
}
else
if (m_uiOffset >= (unsigned int)-iOffset)
iOffset = m_uiOffset + iOffset;
else
{
iOffset = 0;
_LowerLimit_ErrMessage();
}
return *(m_pBaseClass->m_pBuf + iOffset);
}
_C* operator -> ()
{
//这个地方在Release版本中内存分配失败时存在问题(不过发生几率很小,约为%0.01)
_GC_ASSERT(NULL != m_pBaseClass);
return m_pBaseClass->m_pBuf + m_uiOffset;
}
_GC_Y<_C> operator + (int iOffset)
{
_GC_Y<_C> Temp = *this;
if (NULL != m_pBaseClass)
{
if (iOffset >0)
if (m_pBaseClass->m_uiSize-1 - m_uiOffset >= (unsigned int)iOffset)
iOffset = m_uiOffset + iOffset;
else
{
iOffset = m_pBaseClass->m_uiSize-1;
_UpperLimit_ErrMessage();
}
else
if (m_uiOffset >= (unsigned int)-iOffset)
iOffset = m_uiOffset + iOffset;
else
{
iOffset = 0;
_LowerLimit_ErrMessage();
}
Temp.m_uiOffset = (unsigned int)iOffset;
}
return Temp;
}
_GC_Y<_C> operator - (int iOffset)
{
return this->operator + (-iOffset);
}
operator _C* ()
{
//这个地方在Release版本中内存分配失败时存在问题(不过发生几率很小,约为%0.01)
_GC_ASSERT(NULL != m_pBaseClass);
return m_pBaseClass->m_pBuf + m_uiOffset;
}
unsigned int GetSize() const
{
if (NULL != m_pBaseClass)
return m_pBaseClass->m_uiSize;
return 0;
}
unsigned int GetCurrent() const
{
return m_uiOffset;
}
private:
unsigned int m_uiOffset;
_GC_X<_C>* m_pBaseClass;
};
ookook
2003-12-12
打赏
举报
回复
//GarbageCollect.h文件(第二部分)
template <typename _C>
class _GC_Y
{
public:
_GC_Y()
{
m_uiOffset = 0;
m_pBaseClass = NULL;
}
explicit _GC_Y(_C* pBuf)
{
m_uiOffset = 0;
m_pBaseClass = new _GC_XY<_C>(pBuf);
}
explicit _GC_Y(const unsigned int uiSize)
{
m_uiOffset = 0;
m_pBaseClass = new _GC_XX<_C>(uiSize);
}
_GC_Y(const _GC_Y<_C>& Other)
{
m_uiOffset = Other.m_uiOffset;
m_pBaseClass = Other.m_pBaseClass;
NULL != m_pBaseClass && InterlockedIncrement((long*)&(m_pBaseClass->m_uiCounter));
}
~_GC_Y()
{
if (NULL != m_pBaseClass && 0 == InterlockedDecrement((long*)&m_pBaseClass->m_uiCounter))
delete m_pBaseClass;
}
_GC_Y<_C>& operator = (const _GC_Y<_C>& Other)
{
if (this != &Other)
{
if (NULL != m_pBaseClass && 0 == InterlockedDecrement((long*)&m_pBaseClass->m_uiCounter))
delete m_pBaseClass;
m_uiOffset = Other.m_uiOffset;
m_pBaseClass = Other.m_pBaseClass;
NULL != m_pBaseClass && InterlockedIncrement((long*)&m_pBaseClass->m_uiCounter);
}
return *this;
}
_GC_Y<_C>& operator = (const int Other)
{
_GC_ASSERT(0 == Other);
if (NULL != m_pBaseClass && 0 == InterlockedDecrement((long*)&m_pBaseClass->m_uiCounter))
delete m_pBaseClass;
m_uiOffset = 0;
m_pBaseClass = NULL;
return *this;
}
/*
_GC_Y<_C>& operator = (const void* Other)
{
_GC_ASSERT(0 == (int)Other);
if (NULL != m_pBaseClass && 0 == InterlockedDecrement((long*)&m_pBaseClass->m_uiCounter))
delete m_pBaseClass;
m_uiOffset = 0;
m_pBaseClass = NULL;
return *this;
}
*/
bool operator == (const _GC_Y<_C>& Other) const
{
if (m_pBaseClass == Other.m_pBaseClass)
return true;
return false;
}
bool operator == (const int Other) const
{
if (0 != Other)
return false;
if (NULL == m_pBaseClass || NULL == m_pBaseClass->m_pBuf)
return true;
return false;
}
/*
bool operator == (const void* Other)
{
if (0 != (int) Other)
return false;
if (NULL == m_pBaseClass || NULL == m_pBaseClass->m_pBuf)
return true;
return false;
}
*/
bool operator != (const _GC_Y<_C>& Other) const
{
if (m_pBaseClass != Other.m_pBaseClass)
return true;
return false;
}
bool operator != (const int Other) const
{
if (0 != Other)
return true;
if (NULL != m_pBaseClass && NULL != m_pBaseClass->m_pBuf)
return true;
return false;
}
/*
bool operator != (const void* Other)
{
if (0 != (int) Other)
return true;
if (NULL != m_pBaseClass && NULL != m_pBaseClass->m_pBuf)
return true;
return false;
}
*/
bool CompleteEqual (const _GC_Y<_C>& Other)
{
if (m_pBaseClass == Other.m_pBaseClass && m_uiOffset == Other.m_uiOffset)
return true;
return false;
}
ookook
2003-12-12
打赏
举报
回复
//GarbageCollect.h文件(第一部分)
/****************************************************************************
* *
* GARBAGECOLLECT.h -- Garbage Memory Auto Collect *
* *
* Version 1.0, Bug report to MAIL: ok-ok-ok-ok@163.com. *
* *
* Copyright (c) 2003-2004 by Mike Cao. All rights reserved. *
* *
****************************************************************************/
#ifndef _GARBAGE_COLLECT_H
#define _GARBAGE_COLLECT_H
#ifndef __cplusplus
#error C++ compiler required.
#endif
#ifndef _MSC_VER
#error Microsoft C++ compiler required.
#endif
#include <Windows.h>
#pragma warning(disable: 4284)
#pragma message("/****************************************************************************")
#pragma message("* *")
#pragma message("* GARBAGECOLLECT.h -- Garbage Memory Auto Collect *")
#pragma message("* *")
#pragma message("* Copyright (c) 2003-2004 by Mike Cao. All rights reserved. *")
#pragma message("* *")
#pragma message("****************************************************************************/")
#ifndef NULL
#define NULL 0
//#define NULL ((void*)0)
#endif
#ifdef _DEBUG
//如果要判断的表达式很长,扩大_GC_ERR_BUF的值
#define _GC_ERR_BUF 1024
#define _GC_ASSERT(_X) ((void)( (_X) || (_GC_ErrMessage("_GC_ASSERT( "#_X" )", __FILE__, __LINE__), 0) ))
void _GC_ErrMessage(const char* _X, const char* _F, const int _L)
{
TCHAR pBuf[_GC_ERR_BUF];
wsprintf(pBuf, TEXT("Application Runtime Occur Error.\n\n")
TEXT("Reason: %hs\n")
TEXT("File: %hs\n")
TEXT("Line: %d\n")
TEXT("\nFor information on how you program can cause this error, see \n")
TEXT("you code on this line.\n\n")
TEXT("(Press Yes to exit the application, No to continue.)"), _X, _F, _L);
if (IDYES == MessageBox(NULL, pBuf, TEXT("GC Debug Error"), MB_YESNO | MB_ICONERROR))
ExitProcess(unsigned int(-1));
}
#define _UpperLimit_ErrMessage() _GC_ErrMessage("Access memory beyond upper limit.", __FILE__, __LINE__)
#define _LowerLimit_ErrMessage() _GC_ErrMessage("Access Memory under lower limit.", __FILE__, __LINE__)
#else
#define _GC_ASSERT(_X) ((void)0)
#define _UpperLimit_ErrMessage() ((void)0)
#define _LowerLimit_ErrMessage() ((void)0)
#endif
template <typename>
class _GC_Y;
template <typename _C>
class _GC_X
{
protected:
friend class _GC_Y<_C>;
_GC_X(){};
virtual ~_GC_X(){};
unsigned int m_uiCounter;
_C* m_pBuf;
unsigned int m_uiSize;
};
template <typename _C>
class _GC_XX :public _GC_X<_C>
{
protected:
friend class _GC_Y<_C>;
_GC_XX(const unsigned int uiSize)
{
m_uiSize = uiSize;
m_uiCounter = 1;
m_pBuf = new _C[uiSize];
}
~_GC_XX()
{
delete []m_pBuf;
}
};
template <typename _C>
class _GC_XY :public _GC_X<_C>
{
protected:
friend class _GC_Y<_C>;
_GC_XY(_C* pBuf)
{
m_uiSize = 1;
m_uiCounter = 1;
m_pBuf = pBuf;
}
~_GC_XY()
{
delete m_pBuf;
}
};
java
中的
指针
_
Java
中的
指针
java
中的
指针
Java
中有
指针
吗? 简短的答案是“不,没有”,这对于许多开发人员来说似乎是显而易见的。 但是,为什么对其他人却不那么明显呢? http://stackoverflow.com/questions/1750106/how-can-i-use-pointers-in-
java
http://stackoverflow.com/questions/2629357/do...
JAVA
GC
垃圾回收机制详解
引言 在上一篇博客中我们详细分析了,JVM的内存结构。既然提到了JVM那么我们必须得谈一谈
GC
垃圾回收机制了,在分析垃圾回收机制之前呢,我们还是需要来内存结构中堆(Heap)的详细结构。 图中展示了堆中三个区域:Eden、From Survivor、To Survivor。从图中可以也可以看到它们的大小比例,准确来说是:8:1:1。为什么要这样设计呢,本篇文章后续会给出解答,还是根据垃圾...
java
.nio.ByteBuffer详解
一、ByteBuffer原理 关于这个类,其实他有两个子类:
一个
是HeapByteBuffer和DirectByteBuffer关于这两个类的区别很好理解: DirectByteBuffer不是分配在堆上的,它不被
GC
直接管理(但Direct Buffer的
JAVA
对象是归
GC
管理的,只要
GC
回收了它的
JAVA
对象,操作系统才会释放Direct Buffer所申请的空间),它似乎给人感觉是“内...
基础篇:
java
GC
总结.
垃圾标记算法 垃圾回收算法 major
gc
、mini
gc
、full
gc
、mixed
gc
又是什么,怎么触发的 垃圾回收器的介绍 Safe Point 和 Safe Region 什么是 TLAB 和 PLAB ? CMS、G1 新生代的
GC
如何避免全堆扫描 CMS 和 G1 为了防止并发时的漏标分别用了什么手段 什么是 logging write barrier CMS 常见问题
GC
事件和日志分析 JVM 常用参数汇总 关注公众号,一起交流:潜行前行 1 垃圾标记算法
Java
Hotspot G1
GC
的理解总结
G1垃圾回收原理和回收过程分析,并给出适用场景和应用建议 参考文献、书籍及链接 1.https://tech.meituan.com/2016/09/23/g1.html 2.书
C++ 语言
64,639
社区成员
250,578
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章