Estoy implementando una clase de montón binario. El montón se implementa como una matriz que se asigna dinámicamente. La clase tiene miembros montón de capacidad, tamaño y un puntero a una matriz, como:Malloc en constructores
class Heap
{
private:
Heap* H;
int capacity; //Size of the array.
int size; //Number of elements currently in the array
ElementType* Elements; //Pointer to the array of size (capacity+1)
//I've omitted the rest of the class.
};
Mi construcor se ve así:
Heap::Heap (int maxElements)
{
H = (Heap*) malloc (sizeof (Heap));
H -> Elements = (ElementType*) malloc ((maxElements+1)*sizeof (ElementType));
H -> Elements[0] = DUMMY_VALUE; //Dummy value
H -> capacity = maxElements;
H -> size = 0;
}
Desde que estoy mallocing dos veces y eliminación de referencias ambos punteros en el constructor , Debería verificar si tiene éxito. Pero, ¿qué debo hacer si falla? El constructor no puede devolver nada para indicar que falló. ¿Es una buena práctica de programación evitar mallocs en constructores en conjunto?
Hola, @Sahil! Bienvenido a Stack Overflow. Gracias por pegar el código que es relevante para su pregunta, pero por favor formatéelo como código cuando haga su próxima pregunta (sangría cada línea de cuatro espacios, o use el botón etiquetado '{}'). Además, no creo que necesite su variable de miembro 'H' en absoluto. El espacio para el objeto 'Heap' ya ha sido asignado antes de que se ingrese su constructor. Solo necesita asignar espacio para la matriz 'Elementos'. –
No entiendo por qué su objeto Heap tiene un puntero a otro objeto Heap dentro, especialmente cuando no usa los miembros del objeto que está construyendo. Perdería el primer 'malloc' y usaría los miembros de tu objeto directamente. –
En realidad, es una mala práctica tener el puntero 'H' apuntando a la memoria donde el constructor no se ejecutó. Puedo apostar a que desreferenciar 'H' invoca un comportamiento indefinido. ¿Por qué no simplemente almacenar 'capacity',' size' y 'Elements' directamente en su clase? – Vlad