В поисках ответа на другой вопрос я могу найти комментарий здесь :
Размещение нового было бы интуитивно понятным, но, к сожалению, new (p) Class(args);
выполняет нулевую инициализацию перед вызов конструктора, который стирает значения, которые код выделения / инициализации python поместил в память объекта (например, счетчик ссылок). По отдельности использование new char[n]
, тогда наложение структур опасно, потому что гарантированное выравнивание памяти составляет только 1. - Тони Делрой 16 марта 2015 г.
Я собирался использовать следующие реализации в моем расширении. Цитата верна? Не безопасно ли использовать размещение new
, как в моем примере?
template <typename T>
void tp_dealloc(T* self) {
self->~T();
Py_TYPE(self)->tp_free(self);
}
template <typename T>
PyObject* tp_new(PyTypeObject* subtype, PyObject* args, PyObject* kwargs) {
try {
PyObject* obj = subtype->tp_alloc(subtype,0);
new(reinterpret_cast<T*>(obj)) T(args,kwargs);
return obj;
} catch (const std::exception& e) {
PyErr_SetString(PyExc_RuntimeError, e.what());
return nullptr;
}
}