【发布时间】:2014-07-28 01:17:09
【问题描述】:
我有一个 2D 平铺指针向量。每次我加载不同的地图时,我想删除矢量中的所有瓷砖,释放内存,然后用不同的瓷砖重新填充它。
std::vector<std::vector<Tile*>> map;
这是我的 Tile 类:
#ifndef _TILE_H
#define _TILE_H
#include <SFML\Graphics.hpp>
class Tile
{
public:
int type;
int color;
int light_level;
int loc_x, loc_y;
Tile();
~Tile();
sf::Sprite baseSprite;
void Draw(int x, int y, sf::RenderWindow* rw);
void setTexture(sf::Texture& texture);
};
#endif
我这样填充向量:
map[x][y] = tile;
问题是,每次我用 Tiles 重新填充向量时,我的内存都会继续填满,直到游戏崩溃。我的问题是,如何正确删除向量中的所有内容以释放内存?
这是我尝试删除没有释放内存的图块:
for(int ii = 0; ii < this->map.size(); ii++){
for(int jj = 0; jj < this->h; jj++){
delete &this->map[ii][jj]->baseSprite;
delete &this->map[ii][jj]->color;
delete &this->map[ii][jj]->light_level;
delete &this->map[ii][jj]->loc_x;
delete &this->map[ii][jj]->loc_y;
delete &this->map[ii][jj]->type;
delete &this->map[ii][jj];
}
}
map.clear()
如果需要任何额外的代码,请告诉我,谢谢。
【问题讨论】:
-
不确定是否有足够的信息来很好地回答这个问题。但是使用智能指针可能不是一个坏主意。
-
您需要查找 RAII。删除一个 tile 应该有一个析构函数来处理它的成员。
-
看看智能指针,尤其是
std::unique_ptr。如果您不能使用它,请查看 boost 前身。 -
你为什么要删除
Tile的每个成员?它们本身不是指针,你有 UB. -
是的,删除 Tile 的每个成员并没有做任何事情。我正在研究 std::unique_ptr
标签: c++ pointers memory-leaks sfml 2d-vector