【问题标题】:STL vector crash on Android x64Android x64 上的 STL 矢量崩溃
【发布时间】:2016-06-08 09:47:51
【问题描述】:

如果我使用 ndk-buildAndroid 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。如果我在其后添加另一个 CFLAG,例如 -O0,应用程序也不会崩溃。

有人知道为什么吗?

谢谢!

【问题讨论】:

    标签: android vector stl android-ndk ndk-build


    【解决方案1】:

    这也发生在我身上,似乎stlport_static中存在错误。

    我将跟踪放在 push_back 之前、之后以及我 push_back 的复制构造函数中。如果崩溃,它不会到达复制构造函数。如果它碰巧没有崩溃,那么一切都很好。

    我尝试使用 std::map,使用 map 的大小作为键,它不会崩溃,没有调用复制构造函数。也许 std::map 以不同的方式克隆项目。

    最后我使用 gnustl_static 代替 stlport_static 而不更改源代码,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      相关资源
      最近更新 更多