Как правило, вы не можете.
Различные функции выделения памяти (GlobalAlloc
, malloc
, new
, SysAlloc
, VirtualAlloc
, HeapAlloc
) существуют, потому что они выделяют память по-разному, в разных местах, в разных размерах, пометьте ее по-разному, используйте разные базовые менеджеры и множество других отличий. Некоторые из них находятся в локальной куче, некоторые глобальные, некоторые виртуальные, некоторые не указывают, другие выделяют память и что-то с ней делают, например SysAllocString, другие работают с COM, например CoGetMalloc и т. Д.
Если при вызове указывается, что используется один распределитель, вероятно, существует базовый код, который передает память другому процессу или другому поведению, требующему этого распределителя. Вы можете попробовать использовать другой, но это может быть неопределенное поведение.
Чтобы использовать умные указатели с другими распределителями, есть несколько вещей, которые вы можете сделать. Самым простым является предоставление их в качестве функций распределителя и освобождения для класса интеллектуальных указателей, что позволяет ему правильно обрабатывать вещи. В зависимости от вашего указателя выбора, это может потребовать некоторой настройки, или вам может потребоваться собрать базовый умный указатель, способный работать с этим распределителем.
Для обычных MFC и / или ATL часто имеют интеллектуальные указатели и вспомогательные функции, которые работают с одним или несколькими специализированными распределителями. Если это возможно, вы можете посмотреть на это.