前言
本文主要写静态局部变量实现的单例以及单例的释放,网上很多教程只有单例的创建,但是并没有告诉我们单例的内存管理,这就很头疼。静态局部变量实现的单例应该是最简单的单例,而且不需要内存管理。
正文
静态局部变量单例(C++11)
//Singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Singleton; }
QT_END_NAMESPACEclass Singleton : public QWidget
{Q_OBJECTpublic:static Singleton* getInstance();private:// 私有化构造函数,防止外部创建实例Singleton(QWidget *parent = nullptr);// 禁止拷贝构造和赋值操作Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;~Singleton();private:Ui::Singleton *ui;
};
#endif // SINGLETON_H//Singleton.cpp
#include "singleton.h"
#include "ui_singleton.h"
#include <QMutex>
#include "qdebug.h"
Singleton *Singleton::getInstance()
{ static Singleton instance;return &instance;
}
Singleton::Singleton(QWidget *parent): QWidget(parent), ui(new Ui::Singleton)
{ui->setupUi(this);qDebug()<<"单例创建成功";
}Singleton::~Singleton()
{qDebug()<<"单例安全销毁";delete ui;
}
解释:
- 使用 C++11 的静态局部变量机制,该变量在线程首次访问时初始化,自动保证线程安全,代码简洁且高效。
使用
//UseSingleton.cpp
void UseSingleton::on_pushButton_clicked()
{instance = Singleton::getInstance();instance->show();
}
运行结果
点击创建按钮,单例被创建,窗口被关闭时单例并不会被销毁,因为静态变量的生命周期和程序是一样的,只有关闭程序单例才会被销毁。
内存管理
因为是栈上的变量,所以不需要内存管理。