Я бы настоятельно рекомендовал, чтобы модуль, который выполняет выделение, также отвечал за освобождение. Таким образом:
int *ptr = module1->getIntData();
...
module1->freeIntData(ptr);
Это позволяет различным модулям без труда использовать разные распределители (malloc/free, new/delete, slab allocator и т. д.).
В системах Posix в процессе может быть только одна реализация malloc
(и free
), поэтому, если определение getIntData
"возвращает указатель, который должен быть освобожден free
", тогда все будет в порядке. С другой стороны, я думаю, что можно было бы написать два компилятора C++, которые можно было бы использовать для написания модуля1 и модуля2, но которые не могли delete
памяти выделять другим new
. (Хотя я думаю, что такие компиляторы в настоящее время не существуют).
Если есть малейший проблеск шанса, что вам когда-либо придется портировать эту партию на Windows, тогда вы действительно хотите, чтобы модули освобождали выделенную ими память. Различные библиотеки DLL могут иметь разные кучи, что может привести к всевозможным забавным проблемам. (Как говорит @trojanfoe в комментариях: одной лишь разницы между сборками отладки и выпуска может быть достаточно, чтобы вызвать горе.)
Я бы рекомендовал использовать std::unique_ptr
только в том случае, если вы можете гарантировать, что все модули всегда будут собираться с использованием одной и той же версии одного и того же компилятора с использованием одинаковых флагов компилятора. (Я твердо верю в то, что интерфейсы динамических библиотек должны быть как можно более простыми и похожими на C.)
person
Martin Bonner supports Monica
schedule
05.04.2016
createThing()
, вы также должны предоставить методdestroyThing()
для согласованности, если ничего другого. - person trojanfoe   schedule 05.04.2016mutex
или что-то еще. - person someone   schedule 05.04.2016unique_ptr
/shared_ptr
позволяют указывать средства удаления при создании объекта, тем самым упрощая управление памятью и делая явные функции удаления излишними. - person user3159253   schedule 05.04.2016unique_ptr
,shared_ptr
иweak_ptr
зависит от политики владения. - person user3159253   schedule 05.04.2016