Su [email protected], Greg Herlihy ha pubblicato la seguente funzione "C" extern:
extern "C"
{
int func()
{
wchar_t memoryName[256];
wchar_t mutexName[256];
wchar_t eventName[256];
mbstowcs(memoryName, "MemoryName", 256);
mbstowcs(mutexName, "MutexName", 256);
mbstowcs(eventName, "EventName", 256);
std::wstring memoryString(memoryName);
std::wstring mutexString(mutexName);
std::wstring eventString(eventName);
CDataTransferServer *srv = new CDataTransferServer();
srv->Initialize(1, CC_SAMPLETYPE_MPEG4,128,256,64);
printf("Inside entry point tester 1\n");
srv->AddUser(5, memoryString, mutexString, eventString);
printf("Inside entry point tester 2\n");
delete srv;
printf("Exiting entry point tester 3\n");
}
}
che è un punto di ingresso g ++ diverso da main(int argc, char*argv[])
.
Greg Herlihy quindi ha scritto:
Calling _exit() (which presumably should be "_Exit()") - does not "prevent" C++ global objects from being destroyed. The destruction of a C++ program's global objects is not inevitable. Instead a C++ program is responsible for destroying its own global objects - and can do so in one of two ways: the program returns from main() or it calls exit(). So a C++ program that fails to exit main() and neglects to call exit() before it terminates - will not have destroyed its global objects by the time it ended.
Non credo che ciò derivi da ciò che è scritto nello standard.
Per quanto posso vedere, quando chiamo exit()
, la specifica garantisce che:
-
Distruttori per oggetti con durata di archiviazione automatica non sarà chiamato.
-
Distruttori per oggetti con durata di archiviazione statica sarà chiamato, in ordine inverso di costruzione.
The worrying thing is that the standard doesn't say anything about exit() or _exit(), so I'm relying on implementation-dependent behavior.
Non così. Lo standard C ++ specifica che chiamare exit () distrugge globale oggetti [3.6.3 / 1] E _Exit () fa parte dello standard C99 (e lo farà presumibilmente essere incorporato nel prossimo standard C ++ per riferimento).
A destra, lo standard C ++ dice cosa exit()
fa, ma non dice cosa
_exit()
o _Exit()
do. E lo standard C certamente non dice
qualsiasi cosa sui distruttori del C ++.
I don't see any implementation-defined behavior here. Calling _Exit() is no more likely to destroy a C++ program's global objects than calling printf() - or calling any other function that is not exit().
_exit()
e _Exit()
sono specificati per non chiamare alcuna funzione registrata
atexit()
o on_exit()
. Tuttavia, non è utile per C ++ perché
Le specifiche di C ++ non dicono in che modo il runtime si prende cura della chiamata
distruttori di oggetti con durata di archiviazione statica. Un compliant
l'implementazione potrebbe utilizzare un meccanismo diverso da atexit()
o on_exit()
per richiamare i distruttori statici.
In altre parole, le specifiche C ++ non dicono nulla di tutto ciò
comportamento di _exit()
o _Exit()
. Pertanto, non posso formulare ipotesi
sull'opportunità o meno di chiamare una funzione causerà distruttori
di oggetti statici da eseguire o meno.
Qualsiasi commento è benvenuto.