Использование размещения new в реализации tp_new в модуле c ++ python - PullRequest
0 голосов
/ 19 июня 2020

В поисках ответа на другой вопрос я могу найти комментарий здесь :

Размещение нового было бы интуитивно понятным, но, к сожалению, 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;
  }
}
...