In meiner iOS-Anwendung bekomme ich einen EXC_BAD_ACCESS Absturz auf einer der globalen Variablen, die ich in meinem C/C++ Code verwende, wenn die App beendet wird. Bitte beachten Sie, dass die App nicht im Hintergrund angezeigt wird, sondern beim Schließen der App beendet wird, indem Sie angeben, dass sie nicht in der Datei info plist im Hintergrund ausgeführt werden soll.iOS App stürzt bei App-Beendigung mit EXC_BAD_ACCESS auf globalen/statischen Variablen ab
Es folgt die zugehörige Code ..
#include "chromium/threading/thread_local.h"
#include "libev/ev.c"
namespace simplegetter {
ThreadLocalPointer<ev_io> threadLocal_sock_watcher;
ThreadLocalPointer<ev_timer> threadLocal_timer;
void start_get (my_get_struct* get_struct) {
ev_io* sock = new ev_io;
ev_timer* temp_timer = new ev_timer;
threadLocal_sock_watcher.Set(sock);
threadLocal_timer.Set(temp_timer);
//... other code..
}
void fire_again(my_get_struct* get_struct, uint32_t rtt) {
double repeat = get_client_repeat_value(rtt);
if (repeat < 0.5) repeat = 0.5;
threadLocal_timer.Get()->repeat = repeat;
get_struct->prev_timeout_finish_time = CURRENT_TIME_MS;
ev_timer_again(threadLocalLoop.Get(), threadLocal_timer.Get());
//.. other code
}
//... other code
};
threadLocal_timer ist die globale Variable ich spreche. Die Methode start_get wird für einen neuen Thread zum Abrufen einer Netzwerkressource aufgerufen. Die Methode fire_again wird mehrmals im Thread aufgerufen, der die Methode start_get aufgerufen hat, bis der Vorgang abgeschlossen ist.
Jetzt ist das Problem, bei der App-Beendigung (dh wenn iOS einen Exit() -Aufruf auf dem Hauptthread .. (das ist, weil die App nicht in den Status suspendiert oder im Hintergrund ausgeführt werden soll), scheint iOS die globale Variable dh threadLocal_timer in diesem Fall der Freigabe aus, die EXC_BAD_ACCESS in meinem Code in Zeile zu einem Absturz führt:
threadLocal_timer.Get()->repeat = repeat;
So ist die globale Variable vom iOS freigegeben bevor der Thread gestoppt wird Nach der Beendigung der App Meine Frage ist, gibt es eine Lösung, wie ich mit diesem Absturz umgehen kann, abgesehen von der Verwendung von statischen oder globalen v überhaupt im obigen Code?
Welche Bibliothek, welche Variablen? Entschuldigung, wir sind keine Hellseher. – SergeyA
@SergeyA Diese C/C++ - Bibliothek ist eine interne Bibliothek, die einige statische und globale Variablen im Code enthält. ex: ev_timer ist eine solche globale Variable, auf der ein EXC_BAD_ACCESS abstürzt – Ravi
Nein, es ist nicht klar. Wir haben keine Ahnung, was in Ihrer Bibliothek passiert. – SergeyA