Kontext:Ist es sicher zu reinterpret_cast <bool*> Null-Speicher?
Ich habe einen Teil des Speichers, der über shm_open
zwischen zwei Prozessen gemeinsam genutzt werden. Ich bin garantiert, dass nach ftruncate
ing und mmap
ing es, das ganze Stück hat das Bitmuster 00000...
. Ich muss einen booleschen Wert über die beiden Prozesse teilen.
Eine konkretere Frage:
Ist das in Ordnung sein folgendes garantiert (die Behauptung nicht ausfällt und UB nicht auftritt) auf vernünftigen POSIX-Systemen?
void *my_shared_memory_region = calloc(1024, 1);
bool *my_bool = reinterpret_cast<bool*>(my_shared_memory_region);
assert(*my_bool == false);
Ich glaube, dass einige Einschränkungen auf den tatsächlichen Werten gibt, die innerhalb eines bool
leben kann, so dass ich bin mir nicht sicher. Ich denke, diese Frage unterscheidet sich von this one, weil reinterpret_cast
nicht die gleiche Art von Konvertierungen, die C-Style-Casts tun, tun.
Technisch ist es undefiniertes Verhalten in C++, etwas in Malloc'd Space zu tun, außer ein neues Objekt mit Placement-Neu zu erstellen. Persönlich betrachte ich dies eher als einen Fehler im Standard und würde erwarten, dass Ihr Code funktioniert. BTW können Sie 'static_cast' hier verwenden. –
@ M.M: Whoops, danke! –
@ M.M .: Tatsächlich existiert ein Objekt mit trivialer Initialisierung (das schließt "bool" ein), sobald ein Speicher von ausreichender Größe und korrekter Ausrichtung erhalten wird. Das heißt, Sie müssen berücksichtigen, dass es einen unbestimmten Wert enthält, bis Sie mit einem lvalue desselben Typs schreiben (strikte Aliasing-Regel). –