2010-09-01 4 views
5

Можно создать дубликат:
Smart pointers/safe memory management for C?Смарт Указатель Реализация в C

У меня есть встроенное приложение, где я выделяющий объект в динамической памяти и передавать его в другие модули.

Я хотел бы создать умный указатель на этот объект. В C++ существует множество примеров использования и реализации интеллектуальных указателей.

Я ищу реализацию только на языке C умного указателя.

Спасибо.

+7

Но ... нет конструкторов/деструкторов в C! – kennytm

+1

По-видимому, конструкторы и деструкторы лежат в основе умного указателя. –

+0

Да, «умные указатели» становятся бездушными «счетчиками ссылок» без них. –

ответ

2

Да, я думаю, что это невозможно (или, по крайней мере, не так полезно) из-за того, что говорит @KennyTM. Умные указатели возможны из-за автоматического вызова конструкторов и деструкторов. В противном случае вам придется самостоятельно вызвать reference() и unreference(). Все еще полезно?

Кроме того, посмотреть предыдущий, очень связаны SO вопрос: Smart pointers/safe memory management for C?

+0

Спасибо за ответ. Объект является дескриптором флэш-памяти. Я буду использовать другую стратегию. –

1

Вы можете построить «непрозрачный» тип, который полностью инкапсулированный и делать то, что вы хотите во многом так, как вы могли бы сделать это в C++.

Нравится это.

smartpointer.h:

typedef struct sp smartpointer; 

smartpointer new(void *content, size_t s); 
int   delete(smartpointer p) 
void*  dereference(smartpointer p); 
/* ... */ 

smartpointer.c

/* contains the definition of "struct sp" and the implementation of the 
    the functions */ 

, а затем обещаете себе никогда, никогда, никогда не получить доступ к данным, за исключением использования dereference, но, конечно, компилятор не будет применять это для вас.

Итак, у вас много хлопот, и вы должны очень тщательно подумать о том, что вы можете получить.

+1

Я не вижу, как это имеет отношение к умным указателям ... –

+1

@R ..: Ну, этот механизм позволяет вам поддерживать ссылки с подсчитанными указателями. Он сохраняет большую слабость, которую вы должны явно удалить, прежде чем выйти из сферы действия. Это не «умный» способ поддерживать язык OO, но он централизует код подсчета ссылок и делает управление памятью строго локальным делом ... пока вы сохраняете дисциплину, чтобы никогда не нарушать инкапсуляцию. – dmckee

+0

Стоит отметить, что некоторые системы, такие как PalmOS, делают что-то совсем похожее на то, что вы описываете, хотя они требуют, чтобы функция вызывалась, когда она была сделана с помощью указателя на разыменование объекта. Одним из преимуществ этого подхода является то, что объекты могут быть транспарентно перемещены - избегая фрагментации - в любое время, когда нет прямых указателей на них (по крайней мере, никто из них никогда не будет использовать). – supercat

0

Я склонен думать о смарт-указатели, как делать (по крайней мере) 2 вещи для вас:

  • автоматического управления жизни (распределение ресурсов) из памяти/объекта
  • автоматически управляющей собственности объекта (копия семантики и т.д.)

Второй аспект может быть приблизительно, реализуя сильный API, который не позволяет людям копировать/назначать указатели напрямую.

Но первый элемент - это то, где C++ и поддержка языка для конструкторов/деструкторов (сердце RAII) действительно сияют. Это факт, что деструкторы конструкторов & вызываются, посредством кода, который вставляется автоматически компилятором, в правильных местах, которые заставляют магию работать.Без встроенной поддержки языка для CTOR & DTOR, вы просто оцените эффект или полагайтесь на пользователя, чтобы «сделать правильную вещь», когда это необходимо.