2010-09-01 10 views
5

Duplicar posible:
Smart pointers/safe memory management for C?puntero inteligente Implementación en C

tengo una aplicación embebida donde estoy la asignación de un objeto en la memoria dinámica y que pasa a su alrededor para otros módulos.

Me gustaría crear un puntero inteligente para este objeto. Hay muchos ejemplos en C++ para usar e implementar punteros inteligentes.

Estoy buscando una implementación de solo lenguaje C de un puntero inteligente.

Gracias.

+7

Pero ... ¡no hay constructores/destructores en C! – kennytm

+1

Aparentemente, los constructores y los destructores están en el corazón de un puntero inteligente. –

+0

Sí, los "indicadores inteligentes" se convierten en tontos "contadores de referencia" sin ellos. –

Respuesta

2

Sí, creo que es imposible (o al menos, no tan útil) por lo que dice @KennyTM. Los punteros inteligentes son posibles porque los constructores y los destructores se llaman automáticamente. De lo contrario, tendrá que llamar a reference() y unreference() usted mismo. Todavía útil?

Además, ven esto anterior, muy relacionada con SO pregunta: Smart pointers/safe memory management for C?

+0

Gracias por la respuesta. El objeto es un controlador para una memoria Flash. Usaré otra estrategia. –

1

puede construir un tipo de "opaco" que está totalmente encapsulado y hacer lo que quiera en gran parte la forma en que lo haría en C++.

Me gusta.

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 */ 

y luego prometer que nunca, nunca, nunca acceder a los datos, excepto el uso de dereference, pero por supuesto que el compilador no hará cumplir eso para ti.

Por lo tanto, es todo un montón de molestias, y debe pensar muy cuidadosamente sobre lo que puede ganar.

+1

No veo cómo esto tiene algo que ver con los punteros inteligentes ... –

+1

@R ..: Bueno, este mecanismo le permite soportar punteros contados de referencia. Conserva la gran debilidad de que debe eliminarlos explícitamente antes de que salgan del alcance. No es "inteligente" de la misma forma que admite el lenguaje OO, pero centraliza el código de recuento de referencias y hace que la administración de la memoria sea estrictamente local ... siempre que conserve la disciplina de nunca romper la encapsulación. – dmckee

+0

Vale la pena señalar que algunos sistemas como PalmOS hacen cosas como las que describes, aunque requieren que se llame a una función cuando se hace uso de un puntero para desreferenciar un objeto. Una ventaja de este enfoque es que los objetos se pueden reubicar de forma transparente, evitando la fragmentación, en cualquier momento en que no existan indicadores directos para ellos (al menos ninguno que alguna vez use realmente). – supercat

0

que tienden a pensar en punteros inteligentes como hacer (al menos) 2 cosas para usted:

  • que gestiona automáticamente los vida (asignación de recursos) de la memoria/objeto
  • gestionar automáticamente propiedad del objeto (semántica de copia, etc.)

El segundo aspecto puede ser aproximadamente mediante la implementación de una API sólida que no permite que las personas copien/asignen los punteros directamente.

Pero el primer elemento es donde realmente brillan C++ y su soporte de lenguaje para constructores/destructores (el corazón de RAII). Es el hecho de que los constructores & se llaman destructores, por medio de un código que se inserta automáticamente por el compilador, en los lugares correctos, que hacen que la magia funcione.Sin el soporte de lenguaje incorporado para CTORs & DTORs, solo obtendrá una aproximación del efecto, o confiará en que el usuario "haga lo correcto" cuando sea necesario.

Cuestiones relacionadas