单例模式及其析构

单例模式及其析构
#include <cstddef>
class Single {
public:
理性经济人~Single() {}
static Single* instance() {
if (ptr == NULL) {
ptr = new Single;
}
return ptr;
}
void destory() {
if (ptr != NULL) {
delete ptr;
ptr = NULL;
}
}
int getVal() const {
return i;
}
private:
// constructor
丢番图
Single() {
i = 0;
}
// copy constructor
Single(Single&);
// assignment constructor
Single& operator = (const Single&);
// members
static Single* ptr;
int i;
};
int main() {
int val = Single::instance()->getVal();
早熟禾属Single::instance()->destory();
mySingle = NULL;
return 0;
}
使⽤完该单例后,需要释放内存的时候必须注意:
1、不要直接使⽤类的析构函数来释放,否则将引起⽆休⽌的循环!
将析构函数改成如下形式,然后⽤析构函数来释放
Single::~Single() {
if (ptr != NULL) {
delete ptr;
ptr = NULL;
}
}
Single* mySinglePtr = Single::instance();
ph值范围
delete mySinglePtr;
⾸先 delete mySinglePtr;会调⽤Single的析构函数,在析构函数内,进⾏指针判断,如果不为空,则delete ptr,⽽ptr所指的对象是Single,则再去调⽤析构函数,以此往复,形成死循环。
2、正确⽅法:另提供⼀个释放的接⼝,由这个单例的使⽤者来释放。
丝光沸石⽰例程序中,提供了destory的接⼝,⽤户需要释放内存,则调⽤改接⼝。
3、很容易犯的⼀个错误:(类的定义是⽰例程序中的,即不调⽤析构函数,⽽是⽤destory来释放内存)
// ⽤户1
Single* mySinglePtr = Single::instance();
delete mySinglePtr;
mySinglePtr = NULL;
// ⽤户2在⽤户1delete后,使⽤instance
Singel* mySinglePtr2 = Single::instance();
mySinglePtr2->getVal();
// ****此时,出现segment default
原因:⽤户1delete mySinglePtr后,将Single的实例已经释放掉,但是但是!!Single中的ptr没有复位为空指针仍然指向之前new出来的内存(但这块内存已经被delete掉,系统已经回收)。⽤户2要使⽤instance,Single::instance()判断此时的ptr不为空,就直接返回了ptr指针,ptr指向了已经被系统回收的内存,造成segment default。
蛆疗

本文发布于:2024-09-24 15:15:59,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/435019.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:释放   函数   内存   指针   需要   指向
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议