verbos que por letra inglés ingles empiecen diccionario cualidades con comiencen cognados calificativos adjetivos c++ memory-management new-operator

c++ - que - diccionario ingles z



Inicializando un objeto con y sin nuevo operador (7)

¿Por qué el compilador no muestra ningún error en el tiempo de compilación?

Porque, es sintácticamente correcto . Sin embargo, tales declaraciones darán lugar a un comportamiento indefinido , los compiladores inteligentes siempre emitirán advertencias.

En g ++ puede activar este tipo de advertencia del compilador en los errores.

Si tengo una clase Rectangle

class Rectangle{ private: double width; double height; public: void Set(double w , double l){ width = w; height = l; } };

y declaré un objeto como:

Rectangle *Obj;

y luego intente inicializar sus propiedades:

Obj->Set(3,5);

el compilador muestra en tiempo de ejecución: The variable ''Obj'' is being used without being initialized.

El problema puede ser resuelto por:

Rectangle *Obj=new Rectangle;

¡Preguntaría sobre la razón! ¿Y por qué el compilador no muestra ningún error en el tiempo de compilación?


y declaré un objeto como:

Rectangle *Obj;

Incorrecto, esto declara un puntero , no un objeto. Los punteros deben inicializarse utilizando new o asignándoles la dirección de un objeto existente.


Con Rectangle *Obj; , estás declarando un puntero a un rectángulo, pero no le has dicho a Obj a qué rectángulo debe apuntar. Puede establecer o crear una instancia de Obj más tarde en un Rectangle existente o solo si lo necesita.

C ++ se trata de darle un control preciso sobre su memoria y rendimiento. De hecho, ¡es por eso que se usa en algunos entornos integrados! Automáticamente instanciar Obj plantea varios "problemas"

  • ¿Cuándo Obj ?
  • ¿Quién libera a Obj ?
  • ¿Y las implicaciones de rendimiento de crear un Rectangle en el montón?
  • ¿Es este un entorno en el que tenemos suficientes recursos (memoria, CPU, etc.) para incluso crear el Rectángulo, especialmente si es grande?
  • ¿Transfiere la dirección de Obj alguna parte y luego la instancia en el tiempo de ejecución a través de algún método complejo que no podemos analizar de forma estática?

Lo que hace no es un error de sintaxis, que es en lo que los compiladores arrojan errores: errores al compilar. Un analizador (uno está integrado en Visual Studio 2010 Professional) podría advertirle que está utilizando una variable no inicializada, aunque es opcional y es posible que deba activarla.


Mmm un poco de confusión allí:

el compilador muestra en tiempo de ejecución: La variable ''Obj'' se está utilizando sin inicializar

Eso es lo que llamarías tiempo de compilación . Simplemente enderezando la jerga.

Además, la forma más simple sería

Rectangle Obj; Obj.Set(3,5);

que es suficiente para la mayoría de los escenarios, excepto las asignaciones dinámicas o los contenedores polimórficos:

std::vector<Shape*> v; v.push_back(new Rectange()); v.back()->Set(3,5); v.push_back(new Circle()); v.back()->Set(3,5); //

Aunque cada vez que uses new deberías recordar también delete . Esto puede ser una verdadera pesadilla (a la luz de las excepciones, también). Yo sugiero:

std::vector<std::shared_ptr<Shape*> > v; v.push_back(std::make_shared<Rectange>()); v.back()->Set(3,5); v.push_back(std::make_shared<Circle>()); v.back()->Set(3,5);


puntero sin nuevo es declarar algo sin memoria ... DEBERÁ usar nuevo con puntero. Sin embargo Rectángulo rect; asignará de manera predeterminada la memoria.

para comprobar esto, crea un constructor en la clase Rectángulo, como

void Rectangle { cout<<"Rectangle Constructor"; }

luego, en principal

Rectangle *rect; -->>O/P -- "Nothing" Rectangle rect2; -->>O/P -- Rectangle Constructor rect=new Rectangle; -->>O/P -- Rectangle Constructor


La declaración rectangle *obj solo significa que existe un puntero que apunta a la variable de tipo rectangle.

Con esta instrucción solo está creando un puntero, no la instancia del rectángulo del objeto para el uso de este puntero, debe almacenar la dirección de la variable del tipo de rectángulo en el puntero

Las dos formas de hacerlo son por

obj=new rectangle; //variable is created in the stack storage

o

rectangle r; obj =&r; //variable is created in the heap storage


Rectangle *Obj;

simplemente define un puntero a un objeto de clase Rectangle . La definición de un puntero no reserva ninguna memoria para el objeto en sí, solo para el puntero . Por lo tanto, si accede al puntero, es probable que termine en una dirección en la memoria que ni siquiera pertenece a su proceso. Sin embargo, el compilador no puede saber que no ha inicializado el puntero (la palabra clave aquí es aliasing) y, por lo tanto, no puede generar un mensaje de error.

La solución es usar new como los que sugirió o declarar una instancia de Rectangle manera:

Rectangle Obj;

que llamará a un constructor predeterminado. Luego puedes configurar a tus miembros usando

Obj.Set(3, 5);