繁体   English   中英

C ++在Android上崩溃,但在iOS上不崩溃

[英]C++ crash on Android but not on iOS

我正在使用cocos2d-x在iOS和Android上使用C ++开发游戏。 我有一个实现A *寻路算法的函数。 我已经在iOS上进行了开发和测试,并且可以完美运行。 但是,在Android上,此功能会导致崩溃。 相同的C ++逻辑如何在一个设备上顺利运行,而在另一设备上运行不顺利?

不幸的是,该函数是一个相当大的函数,但是我还是会发布它。 如果阅读时间太长,我会对一些可能会导致一台设备崩溃但不会导致另一台设备崩溃的陷阱的一般指示感到满意。 我认为这是正在发生的事情。 创建一个pathStep结构(包含一些整数,并且还具有指向初始步骤的“父”(上一步)的pathStep指针。其索引设置为等于起始索引,并将其地址添加到但是,以某种方式,当在循环开始时从打开列表中检索它时,其索引已从设置为0的任何值更改。

功能如下:

std::vector<pathStep*> GameLayer::findPathBetweenPoints(int startIndex, int targetIndex){

std::list<pathStep*> openList;
std::list<pathStep*> closedList;

pathStep startStep;
startStep.index = startIndex;
startStep.fromStartDist = 0;
startStep.toEndDist = boardDistanceBetweenPoints(startIndex, targetIndex);
startStep.parent = nullptr;

openList.push_back(&startStep);

//PATH FINDING LOOP

do {

//get lowest scoring from open list

int lowestScore = 10000;
pathStep* currentStep;
int currentStepOpenListIndex;
int olIndex = 0;

for (std::list<pathStep*>::iterator i = openList.begin(); i!= openList.end(); i++) {
    pathStep *step = *i;
    if (step->score < lowestScore) {
        currentStep = step;
        lowestScore = step->score;
        currentStepOpenListIndex = olIndex;
    }
    olIndex++;
}
Hexagon *currentHexagon = _hexagons.at(currentStep->index);

//check if it is the target
if (currentStep->index == targetIndex) {
    cocos2d::log("target found!!!!!");
    //return route between points
    std::vector<pathStep*> finalRoute;
    pathStep *step = currentStep;
    for (; ; ) {
        cocos2d::log("step index = %d", step->index);

        finalRoute.push_back(step);
        if (step->index == startIndex) {
            return finalRoute;
        }
        step = step->parent;
    }
}

//remove the current step from the open list and add it to the closed list
    std::list<pathStep*>::iterator iterator = openList.begin();
    std::advance(iterator, currentStepOpenListIndex);
    openList.erase(iterator);

closedList.push_back(currentStep);

//get the adjacent nodes
std::vector<pathStep*> walkableSteps = currentHexagon->getWalkableSteps();
cocos2d::log("num walkable steps returned by hexagon at index %d is %lu", currentHexagon->getIndex(), walkableSteps.size());

//set the parent to the current node
for (int i = 0; i < walkableSteps.size(); i++) {
    pathStep *step = walkableSteps.at(i);
    step->parent = currentStep;

}

//score the walkable steps and add to open list if not already in either list
for (int i = 0; i < walkableSteps.size(); i++) {

    pathStep *step = walkableSteps.at(i);
    step->fromStartDist = currentStep->fromStartDist +1;
    step->toEndDist = boardDistanceBetweenPoints(step->index, targetIndex);
    step->score = step->fromStartDist + step->toEndDist;

    bool isInOpenList = false;
    bool isInClosedList = false;

    //check if is in open list
    for (std::list<pathStep*>::iterator i = openList.begin(); i!= openList.end(); i++) {
        pathStep *olStep = *i;
        if (olStep->index == step->index) {
            isInOpenList = true;
        }
    }
    //check if is closed list
    for (std::list<pathStep*>::iterator i = closedList.begin(); i!= closedList.end(); i++) {
        pathStep *clStep = *i;
        if (clStep->index == step->index) {
            isInClosedList = true;
        }
    }

    //if is not in either list, add to the open list
    if (isInClosedList == false && isInOpenList == false) {
        openList.push_back(step);
    }

}

} while (openList.size() != 0);

cocos2d::log("couldn't find valid path");
std::vector<pathStep*> path;
return path;
}

以下是在iOS上成功运行的控制台日志:

hexagon index 12 //this is the start position
hexagon index 36 //this is the end position
num walkable steps returned by hexagon at index 12 is 4 //from the start position, finds the shortest route to the end position
num walkable steps returned by hexagon at index 21 is 5
num walkable steps returned by hexagon at index 11 is 4
num walkable steps returned by hexagon at index 29 is 6
num walkable steps returned by hexagon at index 20 is 5
num walkable steps returned by hexagon at index 10 is 5
num walkable steps returned by hexagon at index 38 is 6
num walkable steps returned by hexagon at index 28 is 5
num walkable steps returned by hexagon at index 37 is 5
num walkable steps returned by hexagon at index 27 is 4
target found!!!!!
step index = 36 //printing the route back to the start position
step index = 37
step index = 38
step index = 29
step index = 21
step index = 12
go taken //success!

这是在Android上未成功运行的控制台日志:

hexagon index 25 //this is the start position
hexagon index 38 //this is the end position
num walkable steps returned by hexagon at index 0 is 1 //Android always starts at index 0, this looks like it is where the problem arises
num walkable steps returned by hexagon at index 9 is 4
num walkable steps returned by hexagon at index 19 is 6
num walkable steps returned by hexagon at index 18 is 3
num walkable steps returned by hexagon at index 10 is 5
num walkable steps returned by hexagon at index 28 is 5
target found!!!!!
step index = 38
step index = 28
step index = 19
step index = 9
step index = 0
step index = -2125467415 //follows the pointers back until it finds start index, as the initial index was incorrect, keeps going until it ends up in undefined memory
Fatal signal 11 (SIGSEGV) at 0x0a58e044 (code=1), thread 862 (ren.numberboard)

最后,这是来自Android的崩溃日志(似乎告诉我的并不多):

********** Crash dump: **********
Build fingerprint: 'generic/sdk/generic:4.3/JWR66V/737497:eng/test-keys'
pid: 778, tid: 793, name: UNKNOWN  >>> com.stevebarnegren.numberboard <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0a58e044
Assertion failed: (debug_str_.is_mapped() && index < debug_str_.size()), function get_debug_str, file elff/elf_file.h, line 300.
Stack frame #00  pc 001633d4  /data/app-lib/com.stevebarnegren.numberboard-1/libcocos2dcpp.so (GameLayer::findPathBetweenPoints(int, int)+147)Abort trap: 6

谢谢你的帮助!

可能的原因是这条线

openList.push_back(&startStep);

很难遵循您的代码(达到它的大部分!),但是如果将此指针推到要返回的向量上,并且您取消引用此指针,那么您将具有未定义的行为 您不能以任何方式返回指向局部变量的指针或引用。 离开作用域后,将在其中定义局部变量,该局部变量将被“销毁”。

至于为什么似乎可以在一个平台上而不是在另一个平台上工作,那是因为未定义的行为是未定义的。 什么事情都可能发生。

可能是因为它达到了step index = -2125467415step index = -2125467415finalRoute.push_back(step); 没有很好地实现,因此当它转到索引为-2125467415的对象的地址时,无法访问它并崩溃

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM