2016-06-08 1 views
1

Le code suivant se plantera à vec2 (vec.size()) si je construis le code pour x64 Android avec NDK-build (x86 a bien fonctionné).accident vecteur STL sur 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

Il est bizarre. La valeur de vec.size() est égal à 0. Si je change le code comme suit:

vector<int> vec2(0); 

l'application ne plantera pas. Le problème semble provenir de l'optimisation du compilateur. CFLAG -O2 est utilisé par défaut. Si j'ajoute un autre CFLAG, tel que -O0 après, l'application ne tombera pas en panne non plus.

Est-ce que quelqu'un sait pourquoi?

Merci!

Répondre

0

Cela m'est également arrivé, il semble y avoir un bug dans stlport_static.

Je mets trace avant push_back, et après, et dans le constructeur de copie de ce que je push_back. Il n'atteint pas le constructeur de copie s'il s'est écrasé. Si cela ne s'est pas produit, alors tout va bien.

J'ai essayé d'utiliser std :: map, en utilisant la taille de la carte comme clé, elle ne plante pas, aucun constructeur de copie n'est appelé. Peut-être que std :: map clone l'élément de manière différente.

Enfin j'utilise gnustl_static au lieu de stlport_static sans changer le code source, tout fonctionne bien.