Mein Code stürzt regelmäßig auf QNX. Es stürzt mit FehlerStd :: Call_once Lazy Initialisierungsproblem auf QNX
Fehlervariable zu lesen: Speicher kann nicht auf
0x85dd6ac
Adresse zugreifen)
bei dem Versuch, std :: map Membervariable von 0x85dd6ac
Objekt zuzugreifen, die initialisiert std::call_once
mit faul ist.
Initialisierung wird mit dem folgenden Pseudocode durchgeführt:
mutable std::aligned_storage<sizeof(A), alignof(A) >::type m_value;
void init(A *ptr)
{
new (ptr) A();
}
inline T* data() const
{
return reinterpret_cast<A*>(&m_value);
}
const A& get() const
{
std::call_once(m_once_flag, init, data());
return *data();
}
An einem gewissen Punkt, wenn Objekt zurückgegeben von get()
den Vorgang zugegriffen wird, abgestürzt ist.
Auf anderen Plattformen wird das Problem nicht reproduziert und es ist sehr schwierig zu debuggen. Aus dem Code kann ich sehen, dass das Objekt nicht nicht initialisiert werden kann und auch an diesem Punkt nicht gelöscht werden kann.
Ich vermute, es kann ein Problem mit std::call_once
Implementierung mit Thread-Sicherheit oder Speicherordnung sein. Hat jemand Erfahrung mit std :: call_once auf QNX-Plattform oder Bugs so? Irgendwelche Ideen, wie ich das Problem finden kann?
Verwenden Sie GCC? Wild rate: Die QNX Pthreads-Implementierung unterstützt nur die Verwendung von PTHREAD_ONCE_INIT für statische Objekte, und die Verwendung für ein Datenelement im Typ 'std :: once_flag' funktioniert nicht. Macht es einen Unterschied, wenn Sie ein globales 'std :: once_flag' anstelle von' m_once_flag' verwenden? (Ich weiß, das bedeutet, dass Sie die Init nur einmal ausführen können, nicht einmal pro Objekt, aber es könnte helfen, das Problem aufzuspüren). –
@ Jonathan, es ist "veränderbar", also muss es ein nicht-statisches Datenmitglied sein (was das "m_" Präfix auch stark vorschlägt!) –
warum die Variable nicht in der Karte speichern, nur wenn sie gespeichert werden muss? Ich bekomme es nicht –