C++ 导致内存泄漏的单例

C++ 导致内存泄漏的单例,c++,memory-leaks,singleton,C++,Memory Leaks,Singleton,所以我有一个这样的单人游戏课: class GameScene { public: ~GameScene(); static GameScene& GetInstance() { static GameScene instance; return instance; }; void MainMenu(); void Gameplay(); void GameOver(); Sprite

所以我有一个这样的单人游戏课:

class GameScene
{
public:
    ~GameScene();

    static GameScene& GetInstance()
    {
        static GameScene instance;
        return instance;
    };

    void MainMenu();
    void Gameplay();
    void GameOver();

    Sprite Sprites;
    Text* aText[2];
private:
    string MenuText[4];
    TextLabel* m_pText[5];

    GameScene();
    GameScene(const GameScene&) {}
    GameScene& operator=(const GameScene&) {};
};
请注意,我不是单例专家,这是我第一次使用这种特殊的设计模式。

上面这个类的目的是避免在main.cpp中实例化多个游戏对象,而只使用一个可以引用所有这些不同对象的单例实例。这就是我定义类的方式:

#include "GameScene.h"

GameScene::GameScene()
{
    m_pText[0] = new TextLabel("arial.ttf");
    m_pText[1] = new TextLabel("arial.ttf");
    m_pText[2] = new TextLabel("arial.ttf");
    m_pText[3] = new TextLabel("arial.ttf");

    // Do stuff with MenuText etc...
}

GameScene::~GameScene()
{
    // This is not being called :( 
    for (int i = 0; i < 4; ++i)
    {
        delete m_pText[i];
        m_pText[i] = nullptr;
    }
}

void GameScene::MainMenu()
{
    // Display some texts... 
}

void GameScene::Gameplay()
{
    // Display some texts...
}

void GameScene::GameOver()
{
    // Display some texts...
}
我遇到的内存泄漏示例:

{295} normal block at 0x08A668F0, 44 bytes long.
 Data: <    pn          > F0 E4 86 04 70 6E A6 08 F0 E4 86 04 01 00 CD CD 
{294} normal block at 0x08A66DC0, 44 bytes long.
 Data: <Pu  8r   l      > 50 75 A6 08 38 72 A6 08 08 6C A6 08 00 00 CD CD 
{293} normal block at 0x08A66840, 44 bytes long.
0x08A668F0处的
{295}正常块,44字节长。
数据:F0 E4 86 04 70 6E A6 08 F0 E4 86 04 01 00 CD
0x08A66DC0处的{294}正常块,44字节长。
数据:50 75 A6 08 38 72 A6 08 08 6C A6 08 00 CD
0x08A66840处的{293}正常块,44字节长。

注意:我知道我应该在某个时候释放“aText”,但问题不仅仅是aText数组的内存泄漏。我得到了数百个内存泄漏(即使我根本没有分配那么多内存),这肯定与静态实例有关。有什么简单的方法可以解决这个问题吗?多谢各位

静态实例是在您第一次调用
GameSecene::GetInstance
时构造的,但是

用于静态存储持续时间的初始化对象的析构函数(12.4) (在块范围或命名空间范围声明)作为结果被调用 从main返回,并作为调用exit(18.3)的结果

因此,即使没有内存泄漏,内存泄漏检查代码也可能报告内存泄漏。只是还没有调用析构函数

错误报告内存泄漏的示例代码:

#include <memory>

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>

class A {
public:
    A() : pi(std::make_unique<int>(0)) {}
    std::unique_ptr<int> pi;
    static void CreateInstance() {
        static A instanceFunction;
    }
};

void main() {
    _CrtMemState initialMemoryState;
    _CrtMemCheckpoint(&initialMemoryState);

    A::CreateInstance();

    _CrtMemState finalMemoryState;
    _CrtMemCheckpoint(&finalMemoryState);
    _CrtMemState differenceMemoryState;
    if (_CrtMemDifference(&differenceMemoryState, &initialMemoryState, &finalMemoryState))
        _CrtMemDumpAllObjectsSince(&initialMemoryState);
}

另一个解决方案是使用
Init
/
Shutdown
对。

使用
unique\ptr
+放弃该管理器,直接调用singleton
GameSecene::GetInstance()
你在析构函数中设置了断点吗?Scott Meyer的singleton怎么样?
#include <memory>

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>

class A {
public:
    A() : pi(std::make_unique<int>(0)) {}
    std::unique_ptr<int> pi;
    static void CreateInstance() {
        static A instanceFunction;
    }
};

void main() {
    _CrtMemState initialMemoryState;
    _CrtMemCheckpoint(&initialMemoryState);

    A::CreateInstance();

    _CrtMemState finalMemoryState;
    _CrtMemCheckpoint(&finalMemoryState);
    _CrtMemState differenceMemoryState;
    if (_CrtMemDifference(&differenceMemoryState, &initialMemoryState, &finalMemoryState))
        _CrtMemDumpAllObjectsSince(&initialMemoryState);
}
#pragma once
#include <memory>

class A {
public:
    A() : pi(std::make_unique<int>(0)) {}
    std::unique_ptr<int> pi;
    static A& GetInstance() {
        return instance_;
    }
private:
    static A instance_;
};
#include "A.h"

A A::instance_;