primero a destacar: la memoria asignada con el nuevo y borrar está completamente global. las cosas no se eliminan automáticamente cuando los punteros salen del alcance o se sale de una función. siempre que tenga un puntero a la asignación (como el puntero que se devuelve allí), puede eliminarlo siempre y siempre que lo desee. el truco es asegurarse de que otras cosas no lo borren sin que lo sepas.
que es una ventaja con el tipo de estructura de función que tiene la función de lectura de fstream. es bastante claro que toda esa función va a hacer es leer el número de bytes de "tamaño" en el búfer que proporciona, no importa si ese búfer ha sido asignado usando nuevo, si es un búfer estático o global, o incluso un búfer local, o incluso solo un puntero a una estructura local. y también es bastante claro que la función no va a hacer nada más con el buffer que pasa una vez que le leen los datos.
Por otro lado, tome la estructura de su función ReadBlock; si no tienes el código para eso, sería complicado averiguar exactamente qué devuelve. ¿Está devolviendo un puntero a la memoria nueva? si es así, ¿espera que lo elimine? ¿Lo eliminará? ¿Si es así cuando? ¿es incluso un nuevo puntero? ¿simplemente está devolviendo una dirección a un búfer estático compartido? si es así, cuándo el búfer se volverá inválido (por ejemplo, sobrescrito por otra cosa)
mirando el código de ReadBlock, está claro que está devolviendo un puntero a la memoria nueva y está esperando que elimine cuando hayas terminado con eso. ese búfer nunca se sobrescribirá ni se invalidará hasta que lo elimine.
speedwise, esa es la otra ventaja de fsream.read: 'usted clasifica el buffer': USTED tiene la opción de elegir cuándo se asigna la memoria. Si va a "leer datos, procesar, eliminar el búfer, leer el búfer de eliminación de proceso de datos, ect ...." va a ser mucho más eficiente simplemente asignar un búfer (al tamaño máximo que necesitará, esto será el tamaño de su lectura individual más grande) y solo use eso para todo, como lo sugirió Stephen.
+1. ¡Esta es una gran pregunta! Contiene muchos recién llegados a la asignación de memoria manual. – Anthony
Esta es una pregunta terrible, los recién llegados deben aprender a usar un 'std :: string' o' std :: vector'. –
@Mattieu: ¿En lugar de aprender cómo std :: string y std :: vector funcionan bajo el capó? Creo que es una buena pregunta, aunque puedo ser parcial porque es una que sigo teniendo yo mismo, ya que no quiero simplemente comenzar a usar bibliotecas aleatorias sin saber lo que están haciendo. – abelito