operador destructores delete constructores c++ constructor destructor new-operator

delete - Acerca de los constructores/destructores y los operadores nuevos/eliminar en C++ para objetos personalizados



constructores y destructores c++ pdf (3)

Supongamos que tengo una lista de enlaces que creé yo mismo. Tiene su propio destructor, que libera la memoria. Esta lista vinculada no sobrecarga nueva o eliminar.

Ahora, intento crear una matriz de dichas listas enlazadas (hashing abierto, si entiendo correctamente). A continuación, asigno la memoria necesaria dentro del constructor de esta clase hash abierta. El nuevo operador al que se llama dentro del constructor es suficiente para asignar correctamente la memoria para la matriz, ¿verdad? No estoy seguro porque no he sobrecargado nuevo para la clase Lista enlazada.

Además, suponiendo que mi matriz de listas vinculadas se llame elementos, ¿podría simplemente escribir "eliminar [] elementos" en el destructor? ¿Llamaría eso al destructor para cada elemento de la matriz y liberaría correctamente la memoria?

Finalmente, si mis dos suposiciones son correctas (es decir, no tengo que sobrecargar nuevas y eliminarlas para usarlas con mi clase personalizada), ¿cuál es el punto de sobrecargar esos operadores?


El nuevo operador hace dos cosas: asignando memoria y llamando al constructor.

El operador de eliminación llama al destructor y luego libera la memoria.

Las matrices creadas con new [] deben destruirse con delete [] .

Por lo general, no es necesario sobrecargar nuevas o eliminar, salvo por motivos de rendimiento. Es posible que tenga un patrón predecible de asignación / desasignación que hace que una estrategia de asignación particular sea muy adecuada (uso rápido o con poca memoria).

Es posible que desee echarle un vistazo a esta página .


Todas sus suposiciones son correctas.

Hay muchos usos para sobrecargar nuevos y eliminar, pero no se hace a menudo. Una razón común es el seguimiento de las asignaciones de memoria para detectar fugas de memoria. Muchos rastreadores de pérdida de tiempo de compilación lo hacen, pero se han vuelto obsoletos con mejores aplicaciones externas como valgrind. También puede hacer cosas como usar memoria compartida.


Si, tienes razón. Una llanura

elements = new LinkedList[N];

es suficiente para asignarlos. A continuación, puede acceder a ellos

elements[i]->push(....);

y elimínelos en su destructor usando la forma en que mostró:

delete[] elements;

El compilador recordará cuántos elementos se asignaron y llamará al destructor para cada lista correctamente. El punto de sobrecargar al operador nuevo y eliminar es proporcionar una estrategia de asignación de memoria personalizada. Por ejemplo, puede preasignar memoria, y luego tomar de ese grupo, en lugar de asignar memoria cada vez más desde el sistema operativo.

Pero tenga en cuenta que también debe escribir un constructor de copias y un operador de asignación de copias. Dado que si alguien copia su mapa hash, la lista vinculada debe copiarse también, y no solo el puntero. O puede hacer que el constructor de copias y el operador de asignación de copias sean privados y no los defina, no permitiendo copias de su mapa de hash:

.... private: MyHashMap(MyHashMap const& rhs); MyHashMap & operator=(MyHashMap const& rhs); ....