Сделайте я должен удалить структуры, упорядоченные через Маршала. PtrToStructure в неуправляемом коде?

Предварительно мне кажется, что может иметь больше смысла, вместо того, чтобы хранить ваш диктант как { id : seq }, хранить его как { seq : [id_list] }. Поскольку кажется, что в каждой последовательности много повторов, это сэкономит время при доступе ко всем идентификаторам определенной последовательности. Вы можете сделать это при чтении ваших данных, используя defaultdict со значением по умолчанию в качестве пустого списка, а когда вы читаете идентификатор и последовательность, вы можете добавить его к dict с помощью sequences_dict[record.seq].append(record.description).

Дайте мне знать, если это поможет, и могу ли я помочь с чем-либо еще.

12
задан Serguei 30 January 2009 в 22:08
поделиться

2 ответа

Как Erik сказал, Маршал действительно имеет в виду копию, но я не думаю, что он ответил на основной момент Вашего вопроса.

Необходимо ли держать на pData собственный указатель, пока MyDataStructure не является GCed? Нет.

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

11
ответ дан 2 December 2019 в 19:33
поделиться

Да, в этом случае Маршалл означает копию; таким образом необходимо освободить память в неуправляемом коде. Весь вызов к PtrToStructure делает читается многие байты, обозначенные размером целевой структуры 'MyDataStructure' от ячейки памяти, на которую указывает pData.

Детали, конечно, зависят от точно, на что 'MyDataStructure' похож (сделайте Вы используете любые атрибуты FieldOffset или StructLayout в MyDataStructure) - но конечный результат состоит в том, что возврат из PtrToStructure является копией данных.

Как GBegen указывает в его ответе, я не ответил на основной момент Вашего вопроса. Да, необходимо будет удалить неуправляемую копию структуры в неуправляемом коде, но не, Вы не должны держать на pData - можно удалить неуправляемую копию, как только вызов к PtrToStructure завершается.

PS: я отредактировал свое сообщение для содержания этой информации, чтобы консолидировать ответы в одно сообщение - если любой upvotes этот ответ, upvote ответ GBEGEN также для его вклада.

7
ответ дан 2 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

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