1

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

你好.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;    
}

安卓.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,应用程序也不会崩溃。

有人知道为什么吗?

谢谢!

4

1 回答 1

0

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

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

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

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

于 2016-09-07T21:22:27.273 回答