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
+放弃该管理器,直接调用singletonGameSecene::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_;