Hier ist die Variable ptr
, die von Lambda erfasst wird, und während functor()
wird der Aufruffunktor zuerst durch functor = nullptr
gelöscht und dann auf ptr
zugegriffen. Ich denke, dass ptr
beschädigt wurde, da es ein Feld eines gelöschten Funktors war. Alle Compiler führen dieses Programm erfolgreich ohne Abstürze aus und drucken "9", aber ich bezweifle immer noch, dass dies kein undefiniertes Verhalten ist. Kann es jemand bestätigen?
Es ist tatsächlich undefiniert.
So können Sie es bestätigen:
%Vor%Der obige Code wird gedruckt (auf GCC und Clang):
%Vor%
Die drei zerstörten Instanzen sind: eine, die vom ursprünglichen Lambda erfasst wird, eine, die von einer in functor
gespeicherten Kopie erfasst wird, und eine, die von einem temporären std::function::operator=(F &&)
aus irgendeinem Grund erfasst wird muss machen.