Android x64上的STL矢量崩溃

时间:2016-06-08 09:47:52

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

如果我使用 ndk-build Android x64 构建代码,以下代码将在 vec2(vec.size())时崩溃( x86 运作良好)。

HELLO.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)

Application.mk

APP_ABI := x86_64

APP_STL := stlport_static

enter image description here

很奇怪。 vec.size()的值等于0.如果我更改代码如下:

vector<int> vec2(0);

该应用不会崩溃。这个问题似乎是由编译器优化引起的。默认情况下使用CFLAG -O2。如果我添加另一个CFLAG,例如-O0之后,应用程序也不会崩溃。

有人知道为什么吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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