Ich habe eine Situation getroffen, die ich denke, es ist undefiniertes Verhalten: Es gibt eine Struktur, die einige Mitglieder hat und einer von ihnen ist ein Void-Zeiger (es ist nicht mein Code und es ist nicht öffentlich, ich nehme an, der Void-Zeiger ist um es generischer zu machen). An einem gewissen Punkt zu diesem Zeiger etwas char Speicher zugewiesen:Gibt bestimmten Speicher für einen ungültigen Zeiger Zeiger undefiniert Verhalten?
void fooTest(ThatStructure * someStrPtr) {
try {
someStrPtr->voidPointer = new char[someStrPtr->someVal + someStrPtr->someOtherVal];
} catch (std::bad_alloc$ ba) {
std::cerr << ba.what << std::endl;
}
// ...
und irgendwann stürzt es bei der Verteilung Teil (Operator neu) mit Segmentation fault (einige Male es funktioniert, gibt es mehr Anrufe diese Funktion , mehr Fälle). Ich habe das in debug gesehen.
Ich weiß auch, dass auf Windows (meine Maschine verwendet Linux) gibt es auch eine Segmentierung Fehler am Anfang (ich nehme an, dass im ersten Aufruf der Funktion, die den Speicher reserviert).
Mehr, wenn ich einen Druck der Werte hinzugefügt:
std::cout << someStrPtr->someVal << " " << someStrPtr->someOtherVal << std::endl;
vor dem try-Block, läuft es bis zum Ende. Dieser Druck habe ich gemacht, um zu sehen, ob es ein anderes Problem bezüglich des Strukturzeigers gibt, aber die Werte sind gedruckt und nicht 0 oder negativ.
Ich habe diese Themen gesehen: topic1, topic2, topic3 und ich denke, dass es einige UB mit dem Void-Zeiger verknüpft ist. Kann jemand mir helfen, das Problem hier zu zeigen, damit ich es lösen kann, danke?
Bitte geben Sie eine [MCVE]. Es ist vollkommen in Ordnung, einem 'void *' 'char *' zuzuweisen. – Barry
Ist dies eine Multithread-Anwendung? – NathanOliver
'bad_aloc $ ba'? – AnT