0

文字列入力からtmxマップを作成する際に問題が発生しました。

bool LevelManager :: initLevel(int currentLevel)
{{
    constchar*マップ;
    試す {

        map = LevelManager :: getLevel(currentLevel);
    } catch(int){
        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");
    } そうしないと {
        1を投げます。
    }
    trueを返します。
}

それが私のコードです。非常に不安定です。ほとんどの場合、クラッシュしますが、クラッシュしない場合もあります。文字列マップからマップを読み込んでいます。Wichはconst*charです。私のマップの名前はLevel1.tmxで、次のようにマップをロードすると、tileMap = CCTMXTiledMap :: create( "Level1.tmx"); 常に機能し、クラッシュすることはありません。そして、ロード前の行にログインしているので、mapの値がLevel1.tmxであることを知っています。

クラッシュすると、ログは次のように出力します:(lldb)および行tileMap-> setAnchorPoint(ccp(0,0)); 「スレッド1:EXC_BAD_ACCESS(code = 2、adress = 0x0)」と表示されます

なぜこれが起こるのか、そしてそれを修正する方法を誰かが知っていますか?

どうもありがとう。

追伸:私はxcode、最新のcocos2d-xリリース、iPhoneシミュレーターを使用しています

編集:

ブレークポイントを使用して、タイルマップのロード中に問題が発生した場所を確認しました。

行でtileMap=CCTMXTiledMap :: create(map); 私の変数マップはまだ問題ありません

しかし、オンラインでtileMap-> setAnchorPoint(ccp(0,0)); 突然破損します(ほとんどの場合)

4

2 に答える 2

1

It sounds like you're returning a char* string created on the stack, which means the memory may or may not be corrupted, depending on circumstances, moon phases, and what not.

So the question is: How is getLevel defined and what does it do (post the code)?

If you do something like this:

const char* LevelManager::getLevel(int level)
{
    char* levelName = "default.tmx";
    return levelName;
}

…then that's going to be the culprit. The levelName variable is created on the stack, no memory (on the heap) is allocated for it. The levelName variable and the memory it points to become invalid as soon as the method returns.

Hence when the method leaves this area of memory where levelName points to can be allocated by other parts of the program or other method's stack memory. Whatever is in that area of memory may still be the string, or it may be (partially) overridden by other bits and bytes.

PS: Your exception handling code is …. well it shows a lack of understanding what exception handling does, how to use it and especially when. I hope these are just remnants of trying to get to the bottom of the issue, otherwise get rid of it. I recommend reading a tutorial and introductions on C++ exception handling if you want to continue to use exceptions. Especially something like (map != NULL) should be an assertion, not an exception.

于 2013-01-17T19:28:35.407 に答える
0

それを私が直した。

const char* のせいでした。

マップを char * として返すと、問題なく動作しました。

    const char *levelFileName = level.attribute("ファイル").value();
    char *levelChar = new char[strlen(レベルファイル名) + 1];
    std:: strcpy (levelChar, levelFileName);

return levelChar;

それが私が今マップを返す方法です。

于 2013-01-17T20:54:22.467 に答える