Skip to content

Commit b2c1978

Browse files
authored
bugfix: Keep registered types until after Py_Finalize(). Fix #4459 (#4486)
* Keep registered types until after Py_Finalize(). Fix #4459 * Address reviewer comments
1 parent 9ef65ce commit b2c1978

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

include/pybind11/embed.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,16 @@ inline void finalize_interpreter() {
254254
if (builtins.contains(id) && isinstance<capsule>(builtins[id])) {
255255
internals_ptr_ptr = capsule(builtins[id]);
256256
}
257+
258+
Py_Finalize();
259+
257260
// Local internals contains data managed by the current interpreter, so we must clear them to
258261
// avoid undefined behaviors when initializing another interpreter
262+
// Must be cleared only after Py_Finalize() so atexit and other hooks can still use
263+
// registered_types
259264
detail::get_local_internals().registered_types_cpp.clear();
260265
detail::get_local_internals().registered_exception_translators.clear();
261266

262-
Py_Finalize();
263-
264267
if (internals_ptr_ptr) {
265268
delete *internals_ptr_ptr;
266269
*internals_ptr_ptr = nullptr;

0 commit comments

Comments
 (0)