2016-06-08 12 views
1

Der folgende Code wird bei vec2 abstürzen (vec.size()), wenn ich den Code für Android x64 mit bauen NDK-build (x86 hat gut funktioniert).STL Vektor Absturz auf Android x64

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

Es ist seltsam. Der Wert von vec.size() gleich 0. Wenn ich den Code wie folgt ändern:

vector<int> vec2(0); 

die App wird nicht abstürzen. Das Problem scheint durch Compiler-Optimierung verursacht zu sein. CFLAG -O2 wird standardmäßig verwendet. Wenn ich ein weiteres CFLAG, wie zum Beispiel -O0, hinzufüge, stürzt die App auch nicht ab.

Weiß jemand warum?

Danke!

Antwort

0

Das ist mir auch passiert, scheint es gibt einen Fehler in STLport_static.

Ich legte Trace vor push_back, und nach, und in der Kopie Konstruktor von dem, was ich push_back. Es erreicht den Kopierkonstruktor nicht, wenn es abgestürzt ist. Wenn es nicht stürzte, dann ist alles in Ordnung.

Ich habe versucht, std :: map, mit der Größe der Karte als Schlüssel verwenden, stürzt es nicht ab, keine Kopie Konstruktor heißt. Vielleicht std :: map klonen das Objekt auf andere Weise.

Schließlich benutze ich gnustl_static statt stlport_static ohne Quellcode zu ändern, alles funktioniert gut.