Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环崩溃(Android NDK)_Android_C++_Android Ndk_Crashlytics Android - Fatal编程技术网

循环崩溃(Android NDK)

循环崩溃(Android NDK),android,c++,android-ndk,crashlytics-android,Android,C++,Android Ndk,Crashlytics Android,我有以下代码(来自我的类成员函数): this->mLengOfPath = mFirst->mLengOfPath + mSecond->mLengOfPath; unsigned short* data = mMiddle->mPathContainer; mMiddle->mLengOfPath = 0; for (int index = 0; index < mMiddle->mS

我有以下代码(来自我的类成员函数):

        this->mLengOfPath = mFirst->mLengOfPath + mSecond->mLengOfPath;
        unsigned short* data = mMiddle->mPathContainer;

        mMiddle->mLengOfPath = 0;
        for (int index = 0; index < mMiddle->mSize; index++) {   //crash here
            if (index % 2 == 1 && index > 2){
                mMiddle->mLengOfPath += 
                     GestureUtils::distance(data[index - 3], data[index - 2],
                     data[index - 1], data[index]);
            }
        }
this->mLengOfPath=mFirst->mLengOfPath+mSecond->mLengOfPath;
无符号短*数据=mmidle->mPathContainer;
mmidle->mLengOfPath=0;
对于(int index=0;indexmSize;index++){//crash here
如果(索引%2==1&&index>2){
mmidle->mLengOfPath+=
距离(数据[index-3],数据[index-2],
数据[索引-1],数据[索引];
}
}
在大多数情况下,此代码不会崩溃。但是crashlytics告诉我,我的代码“有时”会在第4行崩溃,我不明白为什么。如果mmidle是nullptr,它应该在第2行崩溃(我已经在那里使用了mmidle)


但crashlytics一直报告第4行是问题所在。有人知道我的代码怎么会在第4行出错吗?

是的,如果指针无效,它就是UB。但我们在讨论Android NDK和统计工具时,考虑到了特定的平台和编译器。对于本机ARM代码行1、2、4,有时可能会在无效指针上崩溃,只有写入null指针才会100%失败


如果
mmidle
为空,则第3行将始终失败,但如果它是否指向数据段,则可能失败,也可能失败。统计工具将突出显示第4行,因为它是一个更经常执行的行:比较表达式在每次迭代中都进行评估。其他行上的故障可能会成为统计噪声。

是否
mmidle
始终是有效指针?如果无效,我的代码应该在第2行崩溃,而不是第4行。这就是我不明白的地方。@s.M.它可能不是nullptr,但仍然无效。invlid指针的效果是不可预测的。但一般来说,如果mSize可能通过外部方式更改,那么这种for()可能是不安全的。这就是UB的问题(并且取消对无效指针的引用,null或其他,是UB),所有关于行为的推测都将变得无用。有时它似乎工作得很好,但在下一刻它会崩溃并烧掉。我很确定当for()运行时mmidle->mSize不会改变。它的大小是在此代码运行之前预先计算的。