unmapped доступ к памяти в массиве, переданный от python до c ++

Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.

Была функция с ключевым словом export, которая была предназначенный для отдельной компиляции. Функция export устарела в C++11 и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export. Отдельная компиляция невозможна в C++ или C++11, но, возможно, в C++17, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.

Для отдельной компиляции, которая должна быть достигнута, разделить проверка шаблона тела должна быть возможна. Кажется, что решение возможно с концепциями. Взгляните на этот документ , недавно представленный на совещании по стандартам. Я думаю, что это не единственное требование, поскольку вам все равно необходимо создать код кода шаблона в коде пользователя.

Отдельная проблема компиляции для шаблонов, я думаю, это также проблема, возникающая при миграции на модули, которые в настоящее время работают.

0
задан Steve Lorimer 13 July 2018 в 17:40
поделиться

1 ответ

Рассол прекрасно. Это неправильный код. Вы берете указатель на данные массива, не делая ничего, чтобы гарантировать, что эти данные фактически живут до тех пор, пока объект, который его использует.

Вам нужно сохранить ссылку на массив и выполнить связанное управление refcount. pybind11, вероятно, имеет какой-то механизм для представления ссылки Python и обработки refcounting для вас. Из быстрого просмотра docs похоже, что ваш код должен, вероятно, принимать значение array_t по значению вместо ссылки на const (поскольку array_t уже представляет ссылку на Python) и сохраняет его в переменная экземпляра array_t.

1
ответ дан user2357112 17 August 2018 в 12:21
поделиться
  • 1
    Неужели у меня есть переменная df, которая удерживает DataFrame живым в python, достаточно, чтобы массив не уничтожался? Или питон читает заранее и знает, что df не используется впоследствии, поэтому он может умозрительно удалить ресурсы? – Steve Lorimer 13 July 2018 в 17:34
  • 2
    Обратите внимание, что я создал несколько других файлов pickle из случайных данных и подмножеств «проблемы». данных, и все они работают – Steve Lorimer 13 July 2018 в 17:34
  • 3
    @SteveLorimer: DataFrame - совершенно другой объект. df.values не гарантируется привязка к DataFrame каким-либо образом; для смешанных dtype DataFrames это будет новый массив. – user2357112 13 July 2018 в 17:36
  • 4
    Ах, я вижу, хорошо, я попытаюсь сначала захватить ссылку на массив – Steve Lorimer 13 July 2018 в 17:38
  • 5
    Я обновил вопрос, чтобы сначала отобразить захват df.values в переменной, а затем передать это моему коду. К сожалению, к сожалению. Кроме того, я бы подумал, что если бы это было причиной проблемы (время жизни временного), я бы увидел, что авария произошла во всех моих других случаях использования тестов, но я не могу заставить ее рушиться вообще, только с этим конкретным рассолом ( даже с другими файлами рассола) – Steve Lorimer 13 July 2018 в 17:41
Другие вопросы по тегам:

Похожие вопросы: