Интеллектуальный перенос указателей CoTaskMemAlloc и CoTaskMemFree - PullRequest
1 голос
/ 24 сентября 2019

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

Я был в списке возможных решений для этого - используя интерфейс C, используя только чисто абстрактные интерфейсы и используя CoTaskMemAlloc / CoTaskMemFree, и последний кажется более простым.

Есть кто-нибудьпытался заставить стандартные умные указатели работать этими двумя способами?Существуют ли реализации интеллектуальных указателей, которые используют эти методы, чтобы интеллектуальные указатели могли совместно использоваться через границы DLL?

1 Ответ

0 голосов
/ 24 сентября 2019

Раньше я пробовал что-то похожее на это.

    template<typename T>
    struct freeArrFunctor
    {
        void operator()(T* arr)
        {
            free(arr);
            arr = NULL;
        }
    };

    template<typename T>
    using unique_array_ptr = std::unique_ptr<T, freeArrFunctor<T>>;

    template<typename T>
    inline unique_array_ptr<T> make_unique_array_ptr (const size_t Nbyte)
    {
        return unique_array_ptr<T>(static_cast<T*>(malloc(Nbyte)));
    }

Сначала вы должны объявить, как будет работать ваш собственный удалитель (здесь я использовал функцию c 'free ()').и используется как пользовательское средство удаления уникального указателя.

Вы можете взглянуть на эту тему , где есть много хороших примеров пользовательского использования уникального указателя.

Таким образом, на основе приведенного выше примера вы можете создать производный умный указатель, например:

cross_unique_ptr<T>, где вы сможете определить свою собственную функцию make (если хотите, иначе создайте непосредственно указатель), а также определите cross_deleter_functor для предоставления этому новому интеллектуальному указателю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...