El problema de la liberación de memoria de objetos singleton en C ++

Liberación automática de memoria de objetos singleton en C ++

 

El patrón singleton es un patrón muy común en diseño. Un objeto es creado por la función estática. Todos los datos futuros son operados por esta función para mantener los datos únicos. También es muy conveniente de usar, pero hay un pequeño problema. Es el problema de la liberación de un solo objeto. Generalmente, liberamos objetos de manera uniforme cuando el programa sale, pero esto no es particularmente perfecto. A veces puede olvidarse de llamar, y luego ocurre una pérdida de memoria. Por supuesto, los sistemas operativos modernos Este programa administra la memoria. Cuando el programa se destruye, los recursos de memoria creados por este programa se reciclarán, pero este es el caso. Por supuesto, aún debemos escribir programas que no pierdan memoria.
Como todos sabemos, el lenguaje C ++ no tiene un mecanismo de recolección de basura en otros lenguajes. Los programadores necesitan administrar manualmente la memoria. El puntero es muy poderoso, pero cuando la operación no es buena, también es fácil causar problemas ... Lo siguiente proporciona una memoria automática para objetos únicos. El método de liberación se puede usar en la programación, es muy conveniente, lo más importante es que la memoria se puede liberar automáticamente :-)

?

1

2

3

4 4

5 5

6 6

7 7

8

9 9

10

11

12

13

14

15

dieciséis

17

18 años

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

 

#include "vld.h"

#include <iostream>

 

class Singleton

{

public:

    ~Singleton()

    {

        std::cout << " ~Singleton()" << std::endl;

    }

 

    static Singleton* Instance()

    {

        if(m_pSingleton == nullptr)

        {

            m_pSingleton = new Singleton();

        }

 

        return m_pSingleton;

    }

 

private:

    class AutoRelease

    {

    public:

        ~AutoRelease()

        {

            if(Singleton::m_pSingleton != nullptr)

            {

                delete Singleton::m_pSingleton;

                Singleton::m_pSingleton = nullptr;

            }

        }

    };

private:

    static Singleton* m_pSingleton;

    static AutoRelease m_auto;

};

 

 

Singleton* Singleton::m_pSingleton = nullptr;

 

Singleton::AutoRelease Singleton::m_auto;

 

 

int main()

{

    Singleton::Instance();//此处只是一个调用单例模式的演示

 

    return 0;

}

Más arriba,
explique que la razón por la cual este código puede lograr la liberación automática de memoria se debe al uso de un truco: el m_auto definido con la clase interna anterior es una variable estática, y el sistema operativo llama a la generación y liberación de variables estáticas. , Para que cuando se destruya m_auto, ingrese automáticamente el destructor de m_auto, es decir, el destructor de la clase AutoRelease. Realizamos la operación de liberar el objeto singleton en esta función, para que pueda liberar automáticamente
ps: "vld "h" es un complemento que detecta fugas de memoria. Puede mostrar información relevante sobre fugas de memoria en la ventana de salida de la consola después de ejecutar el programa. Dirección de descarga: http://www.codeproject.com/Articles/9815/Visual-Leak- Detector-mejorado-memoria-fuga-detección

Wow
发布了206 篇原创文章 · 获赞 18 · 访问量 7万+

Supongo que te gusta

Origin blog.csdn.net/lvmengzou/article/details/105187617
Recomendado
Clasificación