Ruby привлекает больше внимания, чем Python просто, потому что Ruby имеет одного ясного фаворита когда дело доходит до веб-приложений, в то время как Python традиционно имел очень расколотый подход (Zope, Plone, Django, Опоры, Turbogears). Критическая масса наличия почти всех разработчиков, использующих одну систему в противоположность множеству отдельных, делает много для улучшения документации, нахождения и удаления ошибок, создания шумихи и шума, и так далее.
В фактических терминах языка эти два очень похожи во всех кроме синтаксиса, и Python обычно более популярен. Python, возможно, препятствованный, будучи популярным самостоятельно перед веб-платформами, стал грандиозным предприятием, мешающим сообществу согласиться сконцентрироваться на любом единственном подходе.
Как ни странно, библиотеки исходного кода 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
не соответствует стандарту, поскольку сохраняет состояние. Это не должно быть большим препятствием для его использования, но означает, что его использование не гарантирует работу со стандартными контейнерами.
В настоящее время мы работаем над 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.
Вы можете попробовать посмотреть, существуют ли какие-либо формальные правила C ++ для того, что происходит, когда исключение генерируется в одной DLL и перехватывается в другой, а затем выходит за пределы области видимости - это кажется очень похожим . В случае исключений, я думаю , что вам необходимо предоставить конструктор копирования со специальной подписью, хотя сейчас я не уверен, что это такое.