2016-05-03 21 views

Antwort

5

Des Code endet eine dangling Referenz Speichern (an ein Objekt, das nicht mehr existiert) innerhalb der Funktion Wrapper und die Funktion führt zu undefiniertem Verhalten aufruft.

Wenn das ursprüngliche Objekt nicht so lange wie die Wrapper nicht leben, kann man immer speichern Sie eine Kopie des Objekts in der Verpackung:

f = std::bind(&A::shout, a); 
//      ^^^ copy 
+0

[Demo] (https://ideone.com/HGmlXq) –

2

Um dies zu zeigen nicht definiert ist, beachten Sie, dass die Adresse eine ungültige Zeigerwert gespeichert wird, - [basic.stc]/3:

Wenn das Ende der Dauer einer Region der Lagerung erreicht wird, werden die Werte aller Zeiger die Adresse eines beliebigen Teils desrepräsentierefreigegebener Speicher wird zu ungültigen Zeigerwerten ([basic.compound]).

im Aufruf von dem gebundenen Funktors, wird dieser Zeiger dereferenziert das Element Funktionsaufruf durchzuführen, wobei [basic.stc.dynamic.deallocation]/4 gilt:

Indirection durch eine ungültige Zeigerwert und Leiten eines ungültigen Zeigerwert auf einem Deallokationsfunktion haben undefiniertes Verhalten.

Stattdessen können Sie a pro Wert binden (das kaufmännische Und-Zeichen weglassen).

+0

Aufrufe von Memberfunktionen erfordern auch ein Objekt, [class.mfct.non-static] p1. Beachten Sie, dass der Code UB AFAIK nicht hat, wenn 'shout' statisch ist. (Es gibt eine zugrunde liegende Frage von * wenn */* wenn * Umleitung passiert.) – dyp

+0

@dyp Edit: Whoops, ich dachte, du beziehst dich auf/2. – Columbo

+0

Gibt es eine DR für p2? – dyp