如果我使用 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
很奇怪。 vec.size()的值等于0.如果我更改代码如下:
vector<int> vec2(0);
该应用不会崩溃。这个问题似乎是由编译器优化引起的。默认情况下使用CFLAG -O2。如果我添加另一个CFLAG,例如-O0之后,应用程序也不会崩溃。
有人知道为什么吗?
谢谢!
答案 0 :(得分:0)
这也发生在我身上,似乎stlport_static中有一个错误。
我在push_back之前放置了跟踪,之后,在push_back的复制构造函数中。如果崩溃,它不会到达复制构造函数。如果它碰巧没有崩溃,那么一切都很好。
我尝试使用std :: map,使用map的大小作为键,它不会崩溃,也不会调用复制构造函数。也许std :: map以不同的方式克隆项目。
最后我使用gnustl_static而不是stlport_static而没有更改源代码,一切正常。