我在从字符串输入创建tmx映射时遇到问题。
bool LevelManager::initLevel(int currentLevel) { const char* map; try { map = LevelManager::getLevel(currentLevel); } catch (int) { throw 1; } if(map != NULL){ CCLog("%s", map); tileMap = CCTMXTiledMap::create(map); tileMap->setAnchorPoint(ccp(0,0)); tileMap->setPosition(ccp(15,20)); this->addChild(tileMap, 5); backgoundLayer = tileMap->layerNamed("Background"); } else { throw 1; } return true; }
这就是我的代码。 它非常不稳定。大多数时候它会崩溃,有时却不会崩溃。 我正在从字符串映射中加载我的地图。这是一个const * char。 我的地图名为Level1.tmx,当我像这样加载地图时:tileMap = CCTMXTiledMap :: create(“Level1.tmx”);它始终有效,永不崩溃。 而且我知道map的值是Level1.tmx,因为我在加载之前将它记录在行中。
当它崩溃时,日志输出:(lldb) 并在行tileMap-> setAnchorPoint(ccp(0,0));它说“线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x0)
有谁知道为什么会发生这种情况以及如何解决这个问题?
非常感谢。
Ps:我正在使用xcode,最新的cocos2d-x版本和iPhone模拟器
修改
使用断点我在加载tilemap时检查了哪里出了问题。
在行tileMap = CCTMXTiledMap :: create(map); 我的变量图仍然很好
但在线tileMap-> setAnchorPoint(ccp(0,0)); 它突然被破坏(大部分时间)
答案 0 :(得分:1)
听起来你正在返回在堆栈上创建的char *字符串,这意味着内存可能会或可能不会被破坏,具体取决于环境,月相和不存在。
所以问题是:如何定义getLevel以及它做了什么(发布代码)?
如果您这样做:
const char* LevelManager::getLevel(int level)
{
char* levelName = "default.tmx";
return levelName;
}
......然后那将是罪魁祸首。在堆栈上创建了levelName变量,没有为它分配内存(在堆上)。一旦方法返回,levelName变量和它指向的内存将变为无效。
因此,当方法离开此levelName指向的内存区域时,可以由程序的其他部分或其他方法的堆栈内存分配。无论在该内存区域中的任何内容仍可能是字符串,或者它可能(部分)被其他位和字节覆盖。
PS:您的异常处理代码是......它表明缺乏理解异常处理的作用,如何使用它,特别是何时使用它。我希望这些只是试图找到问题的底部的残余,否则摆脱它。如果您想继续使用异常,我建议您阅读有关C ++异常处理的教程和介绍。特别是(map!= NULL)应该是一个断言,而不是例外。
答案 1 :(得分:0)
我修好了。
const char *应该受到责备。
当我将地图作为char *返回时,它完美无瑕。
const char *levelFileName = level.attribute("file").value();
char *levelChar = new char[strlen(levelFileName) + 1];
std:: strcpy (levelChar, levelFileName);
return levelChar;
多数民众赞成我现在如何返回地图。