1

ndk-buildを使用してAndroid x64用のコードをビルドすると、次のコードはvec2(vec.size())でクラッシュします( x86は正常に動作しました)。

こんにちは.cpp

#include <vector>
#include <stdio.h>

using namespace std;

int main(int argc, char* argv[])
{
    vector<int> vec;

    vec.push_back(11);
    vec.clear();

    vector<int> vec2(vec.size());

    return 0;    
}

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.cpp

include $(BUILD_EXECUTABLE)

アプリケーション.mk

APP_ABI := x86_64

APP_STL := stlport_static

ここに画像の説明を入力

それは変だね。vec.size()の値は0 です。次のようにコードを変更すると:

vector<int> vec2(0);

アプリはクラッシュしません。この問題は、コンパイラの最適化が原因のようです。CFLAG -O2 がデフォルトで使用されます。その後に -O0 などの別の CFLAG を追加しても、アプリはクラッシュしません。

理由を知っている人はいますか?

ありがとう!

4

1 に答える 1

0

これは私にも起こりました.stlport_staticにバグがあるようです.

push_back の前と後、および push_back のコピー コンストラクターに trace を配置しました。クラッシュした場合、コピー コンストラクターには到達しません。たまたまクラッシュしなかった場合は、すべて問題ありません。

マップのサイズをキーとして使用してstd::mapを使用しようとしましたが、クラッシュせず、コピーコンストラクターも呼び出されません。多分 std::map アイテムを別の方法で複製します。

最後に、ソース コードを変更せずに stlport_static の代わりに gnustl_static を使用します。すべて正常に動作します。

于 2016-09-07T21:22:27.273 に答える