2012-02-15 43 views
8

Observando Naked Pointers (vea la primera respuesta), las preguntas son bastante simples:¿Qué es un puntero desnudo?

¿Qué es un puntero desnudo?

+5

Un puntero real, a diferencia de un puntero inteligente. – ildjarn

+0

@ildjarn, entonces, ¿qué es un puntero inteligente? :) –

+0

@NickDandoulakis vea el comentario de talnicolas –

Respuesta

10

Aquí es simple ejemplo:

#include <memory> 

struct X { int a,b,c; }; 

int main() 
{ 
    std::shared_ptr<X> sp(new X); 
    X* np = new X; 
    delete np; 
} 

np es puntero al objeto de tipo X - si ha asignado dinámicamente (new/malloc) este objeto, hay que delete/free que ... simple puntero como np se llama "puntero desnudo".

sp es un objeto que contiene un puntero al recurso gestionado, lo que significa que se puede utilizar al igual que usaría np, pero cuando no hay shared_ptr objetos que poseen este recurso, se libera el recurso, por lo que don 't tiene que delete. Punteros inteligentes se ocupan de la gestión de la memoria, por lo que no es necesario;)

+0

por lo que un puntero desnudo está realmente desnudo (es decir, eliminar tiene que ser obligatorio) solamente y solo si se asigna dinámicamente a través de nuevo. – LivingThing

+0

@MuhammadSalman: sí con una excepción : si asigna una matriz con 'a = new int [5];' debe eliminarla así: 'delete [] a;' – LihO

+0

Debe desasignar objetos como los asignó. Lo que significa usar 'malloc'/'calloc' con' libre', 'nuevo' w ith 'delete' y' new [] 'with' delete [] ' – LihO

8

Un puntero desnudo (puntero sin formato, puntero "tonto") es un puntero de estilo C T*. Contraste esto con los punteros "inteligentes" que ofrece C++ (std::shared_ptr<T>, std::weak_ptr<T> y std::unique_ptr<T>).

12

Un "puntero desnudo" es un puntero "simple", es decir, lo que el Estándar y cualquier libro en el puntero de llamada de C++. Es el "T *" habitual (donde T es el tipo de apuntador del puntero).

La terminología "desnudo" llegaron a oponerse a inteligentes punteros, que son clases que se comportan en muchos aspectos como punteros (por lo general sobrecargan los operadores *, -> y en algunos casos []).

punteros inteligentes son "inteligentes" porque especifican y hacer cumplir un cierto dominio semántico, la eliminación de la "mudez" de punteros desnudos: en los hechos desnudos punteros no especifican/saber si propia del objeto que se están refiriendo a (por ejemplo, si debe ser desasignado cuando el puntero sale del alcance) y, incluso si con alguna convención de nombres se sabe que algún puntero posee el objeto si apunta a, el idioma no aplica esto, entonces, si un puntero sale de alcance y nadie lanzó manualmente el objeto puntiagudo (normalmente esto sucede si se produce una excepción) tiene una pérdida de memoria.

Los punteros inteligentes, en cambio, explotan las garantías del sistema tipo de C++ (constructor de copias, operador de asignación, llamadas garantizadas a destructor, ...) para establecer y aplicar algún tipo de propiedad (por lo general: estricto e intransferible, estricto pero puede ser transferible a otro puntero inteligente, compartido entre varios punteros inteligentes).

... Dicho esto, hay un montón de discusiones sobre punteros inteligentes en StackOverflow y en Internet, estoy seguro de que podrá encontrar discusiones más extensas sobre punteros inteligentes y por qué usar punteros desnudos que propios objetos es generalmente una cosa mala TM en un programa moderno de C++.

4

El puntero inteligente es la forma preferida en C++ porque ofrecen una mejor gestión de la memoria.Los punteros inteligentes tienen información adicional (contando el número de referencias, propiedad actual, etc.) junto con la dirección del objeto al que apuntan y, por lo tanto, el nombre puntero inteligente y puntero desnudo no contienen dicha información adicional y, por lo tanto, el nombre puntero desnudo. y por lo tanto, no eliminan el objeto después de que ya no se use porque no tienen la información para hacerlo. Espero que ayude a retener en nuestra mente.

Cuestiones relacionadas