2016-09-19 2 views
0

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?

+2

Bitte geben Sie eine [MCVE]. Es ist vollkommen in Ordnung, einem 'void *' 'char *' zuzuweisen. – Barry

+0

Ist dies eine Multithread-Anwendung? – NathanOliver

+4

'bad_aloc $ ba'? – AnT

Antwort

2

Ein void-Zeiger ist ein völlig in Ordnung, was in C/C++ zu tun, und Sie können in der Regel von/zu anderen Arten werfen

Wenn Sie einen Segmentation Fault erhalten, während der Initialisierung dies einige der verwendeten Parameter bedeutet, sind selbst ungültig oder so:

  • Ist someStrPtr gültig?
  • ist someStrPtr-> someVal und someStrPtr-> someotherVal gültig?
  • Sind die Werte gedruckt, was Sie erwartet haben?
  • Auch wenn dies eine Multithread-Anwendung ist, stellen Sie sicher, dass kein anderer Thread auf diese Variablen zugreift (insbesondere zwischen Ihrer Druck- und Initialisierungsanweisung). Dies ist, was wirklich schwierig zu fangen ist
+0

Also, was war das Problem? –

+0

Noch nicht sicher, aber Sie beantworten die Frage: "Ein Void-Zeiger ist eine perfekte Sache in C/C++". Die anderen Werte scheinen gültig zu sein. Ich habe 'if (! SomeStrPtr) std :: cout <<" KO "<< std :: endl;' (und für die anderen) hinzugefügt und keines der KO wurde gedruckt – sop

3

Nein, das ist kein undefiniertes Verhalten. Im Allgemeinen, wenn der Code "bei dem Zuweisungsabschnitt abstürzt", liegt es daran, dass etwas früher den Heap durcheinander gebracht hat, typischerweise indem über ein Ende eines zugewiesenen Blocks geschrieben wurde oder derselbe Block mehr als einmal freigegeben wurde. Kurz gesagt: Der Fehler ist nicht in diesem Code.

Verwandte Themen