菜鸟问题:如何手动撤消单例模式中的内存空间!避免Singleton理论中的内存泄漏? (参与有分)

xqk 2006-06-19 12:03:19
大家都知道,在VC中单例设计模式的生存空间与进程的生存空间是一样的,所以以进程结束来负责撤消单例模式的空间,但是进程会认为单例模式存在内存泄漏问题!

所以说我现在想使用STL的Functor来手动释放内存空间,但发现一样会出现内存违规访问,大家来帮忙看看怎样写这段代码才能释放掉单例的内存空间?

class ReleaseSingleton;
class CPSMirrorSocket
{
friend ReleaseSingleton;
public:
static CPSMirrorSocket* GetInstance();
private:
CPSMirrorSocket* instance;
}

class ReleaseSingleton
{
public:
operator ()()
{
CPSMirrorSocket* socket = CPSMirrorSocket::GetInstance();
delete socket->instance; //存在违规访问错误
socket->instance = NULL;
}
};
...全文
238 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Stefine 2006-06-19
  • 打赏
  • 举报
回复
在GetInstance里new
在ReleaseInstance里delete

就如手动添加构造与析构,不晓得可行不

有一疑问:

单件的内存泄漏是不用考虑的,因为进程退出时操作系统会自动清理。

想问下难道singleton一般都是由OS来清理吗?
xqk 2006-06-19
  • 打赏
  • 举报
回复
多谢各位帮忙
xiaosong8584 2006-06-19
  • 打赏
  • 举报
回复
只要不是致命错误,其他的不用太在意
xqk 2006-06-19
  • 打赏
  • 举报
回复
但是编译器总提示内存泄漏错误,太烦人了,呵呵
zephyr007 2006-06-19
  • 打赏
  • 举报
回复
单件的内存泄漏是不用考虑的,因为进程退出时操作系统会自动清理。
DentistryDoctor 2006-06-19
  • 打赏
  • 举报
回复
stack overflow ?

不用()呢?
xqk 2006-06-19
  • 打赏
  • 举报
回复
当然是有效的了,否则初始化是NULL,delete NULL 不会有问题的
结果提示错误是 unhandled exception in aa.exe,:0xC00000FD stack overflow

之前使用 CPSMirrorSocket::GetInstance()->func() 调用函数是没有问题的
DentistryDoctor 2006-06-19
  • 打赏
  • 举报
回复
既然是单件,那么程序退出时删除一次就行了?或者给个接口ReleaseInstance

CPSMirrorSocket* socket = CPSMirrorSocket::GetInstance();
//socket是否有效?
delete socket->instance; //存在违规访问错误
吃狼的豆腐 2006-06-19
  • 打赏
  • 举报
回复
还有CPSMirrorSocket::instance应该是static,希望是LZ笔误.
________________________
这个不需要,是计数器是static
xqk 2006-06-19
  • 打赏
  • 举报
回复
我也想写到一个类里呀,不过使用单例设计模式无法写在里边,否则使用函数GetInstance()调用释放函数时会产生无限递归 ,哈哈
booklove 2006-06-19
  • 打赏
  • 举报
回复
接分。

顺便觉得申请和释放不在一个类里,这样的风格不太好吧。
xqk 2006-06-19
  • 打赏
  • 举报
回复
咦,还是楼上的比较细心呀,两个一样的指针都被发现了

呵呵,的确是自己代码写错了,不过这里还是正确的
hijack 2006-06-19
  • 打赏
  • 举报
回复
CPSMirrorSocket* socket = CPSMirrorSocket::GetInstance();
delete socket->instance;
socket->instance = NULL;

这里"socket"是单件对象指针,那"socket->instance"又是什么? 这2个指针值相同?
还有CPSMirrorSocket::instance应该是static,希望是LZ笔误.

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧