Выделение памяти и освобождение через dll границы

Ruby привлекает больше внимания, чем Python просто, потому что Ruby имеет одного ясного фаворита когда дело доходит до веб-приложений, в то время как Python традиционно имел очень расколотый подход (Zope, Plone, Django, Опоры, Turbogears). Критическая масса наличия почти всех разработчиков, использующих одну систему в противоположность множеству отдельных, делает много для улучшения документации, нахождения и удаления ошибок, создания шумихи и шума, и так далее.

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

8
задан Alan 27 August 2009 в 22:40
поделиться

3 ответа

Как ни странно, библиотеки исходного кода Adobe имеют класс adobe :: capture_allocator , который был написан специально с учетом этого вида безопасности DLL. Его работа заключается в захвате локальных new и delete в этот момент, когда он создается, и перенос их обоих на время жизни объекта. (См. adobe :: new_delete_t для получения подробной информации о том, как это делается, особенно реализация здесь .) Распределение выполняется с помощью захваченной подпрограммы delete , гарантируя, что нет независимо от того, где вы находитесь, вы удаляете с помощью правильного delete .

Вы можете увидеть capture_allocator , используемый во всех типах version_1 в библиотеках исходного кода Adobe, например Adobe :: any_regular_t и adobe :: copy_on_write . capture_allocator также должен быть совместим со всеми типами контейнеров STL.

Обновление: capture_allocator не соответствует стандарту, поскольку сохраняет состояние. Это не должно быть большим препятствием для его использования, но означает, что его использование не гарантирует работу со стандартными контейнерами.

8
ответ дан 5 December 2019 в 17:39
поделиться

В настоящее время мы работаем над dll, которая предоставляет функциональность C ++ через интерфейс C (для того, чтобы C # мог использовать указанную dll).

например: dll имеет структуру myStruct_s, интерфейс предоставляет следующие функции:

interface.h

#ifndef INTERFACE_TYPES_H
# error Please include interace_types.h
#endif
    myStruct_s * CreateTheStruct() { return new myStruct_s(); }
    void DestroyTheStruct(myStruct_s * the_struct) { delete the_struct; }
    void DoSomethingToTheStruct(myStruct_s * the_struct);

interface_types.h

#define INTERFACE_TYPES_H
struct myStruct_s; // fwd declaration
#endif

interface.cpp

#if defined(__CPPPLUS) || defined(__cplusplus) || defined (__CPLUSPLUS)
#include<TheRealFileContainingTheRealMyStruct_s.h>
// handle the .h's functions here
#endif

comeOutsideCppFile.cpp

#include "interface_types.h"
#include "interface.h"

void main()
{
    myStuct_s * x = CreateTheStruct;
    DoSomethingToTheStruct(x);
    DestroyTheStruct(x);
}

Выше показан пример того, как работает наш материал. , в основном : Независимо от того, что должна представлять dll, должно быть: создано, обработано, уничтожено на стороне dll

Этот код не на 100% точен !!!

Также имейте в виду, что если вы используете чистый C ++ dll, вам, вероятно, понадобится тот же компилятор с теми же настройками, что и для сборки dll.

2
ответ дан 5 December 2019 в 17:39
поделиться

Вы можете попробовать посмотреть, существуют ли какие-либо формальные правила C ++ для того, что происходит, когда исключение генерируется в одной DLL и перехватывается в другой, а затем выходит за пределы области видимости - это кажется очень похожим . В случае исключений, я думаю , что вам необходимо предоставить конструктор копирования со специальной подписью, хотя сейчас я не уверен, что это такое.

0
ответ дан 5 December 2019 в 17:39
поделиться
Другие вопросы по тегам:

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