2010-04-26 10 views
15

Duplicar posible:
Why would you ever want to allocate memory on the heap rather than the stack?objetos C++ Pointer frente a no Puntero Objetos

Test2 *t2 = new Test2(); 
t2->test(); 

Test2 t3; 
t3.test(); 

¿Por qué querría para crear un objeto de tipo puntero Prueba2? ¿Por qué no simplemente hacer la versión no puntero de Test2? ¿Por qué querría hacer objetos de puntero?

respuesta Encontrado aquí:

+1

Muchos duplicados, el primero de los cuales es (de respuesta de Firas Assaad) http://stackoverflow.com/questions/1549945/why-would-you-ever-want-to-allocate-memory-on-the-heap -rather-than-the-stack –

+1

Me doy cuenta de eso ahora. Sin embargo, hacer la pregunta fue la parte difícil. Ahora creo que lo entiendo ...: D –

Respuesta

19

Las razones para utilizar el almacenamiento dinámico incluir (pero probablemente no limitados a)

  1. Control manual de la vida útil de los objetos - el objeto vivirá hasta que destruya explícitamente
  2. Creación de tantos objetos como sea necesario, cuando el número final de objetos solo se conoce en tiempo de ejecución (como el número de nodos en un árbol o la cantidad de elementos en una matriz).
  3. Control en tiempo de ejecución del tipo del objeto (como el tipo real de objeto polimórfico).

Cuando no hace la diferencia, siempre es mejor crear el objeto utilizando su método t3. No use memoria dinámica a menos que sea necesario. Pero a veces realmente tienes que (ver las razones anteriores).

7

Si necesita que un objeto sobreviva al ámbito en el que se creó, una de las soluciones sería crearlo en el Heap. En ese caso, necesitarías un puntero. También hay otras razones, esta es la más común.

Otra razón para usar punteros es para los parámetros de "salida". De acuerdo, podría usar referencias, pero muchos prefieren usar punteros ya que obvian la modificación del parámetro en el sitio de llamadas. foo(var); vs foo(&var);

Además, los punteros se pueden utilizar para pasar o devolver un objeto que puede existir o no. Por ejemplo: T *foo(); // returns a pointer to an object or NULL if none exists.

La lista sigue y sigue realmente.

+0

¿Puede enumerar algunas de las otras razones? –

+1

No es cierto. El objeto declarado como 'Test2 t3;' estático en el alcance local sobrevivirá el alcance en el que se creó. Sin embargo, no se crea en el montón. – AnT

+0

@AndreT: buen punto, revisaré mi respuesta. –

3

Cualquier tipo de estructura de datos dinámicos (listas, árboles binarios, pilas, etc.) debe usar punteros a los objetos.

1

Una implementación común (pero no obligatoria) es que las variables locales se asignan en la pila. La pila es finita, y es posible tener un objeto demasiado grande para asignarlo en la pila.

4

Si tiene un objeto muy grande (por ejemplo, uno con búferes muy grandes como miembros), puede que no desee asignarlo a la pila, ya que el espacio de pila es limitado, en ese caso asigna en el montón con el operador nuevo.

+0

Gracias; Soy un programador de Java y C++, pero mis clases nunca superaron la pila/montón ... –

2

La principal diferencia es dónde vive en la memoria. La "versión no apuntadora" vive en la pila, lo que significa que no será válida una vez que la función regrese, mientras que la "versión del puntero" vive en el montón, lo que significa que estará vivo y en buen estado hasta que alguien llame al delete. En general, se considera una mejor práctica colocar objetos en la pila siempre que sea posible, y solo en el montón cuando sea necesario. Un buen ejemplo de la necesidad del objeto en el montón sería algo como esto

Obj* f() 
{ 
    return new Obj(); 
} 

la new Obj() crea un objeto Obj en el montón y devuelve un puntero a ella, que se devuelve después de la función.

Esto, por ejemplo, no funcionaría

Obj* f() 
{ 
    Obj o1; 
    return &o1; //BAD!! 
} 

Dado que el valor del puntero de memoria &o1 referencias en la pila, y f() es despejado de la pila en ese punto, que sabe lo que va a pasar. Definitivamente nada bueno.

Cuestiones relacionadas