new - pointer c++
Encontrar el tamaño de la matriz asignada dinámicamente (7)
¿Hay algún medio para acceder a la longitud antes de eliminar la matriz?
No. No hay manera de determinar eso.
La norma no requiere que la implementación recuerde y proporcione los detalles del número de elementos solicitados a través de new
.
La implementación puede simplemente insertar patrones de bits específicos al final de los bloques de memoria asignados en lugar de recordar el número de elementos, y puede simplemente buscar el patrón mientras se libera la memoria.
En resumen, es únicamente un detalle de la implantación.
En una nota al margen, hay 2 opciones para superar prácticamente este problema:
- Puede usar simplemente un
std::vector
que le proporciona funciones miembro comosize()
o - Usted puede simplemente hacer la contabilidad usted mismo.
new
menos asigna suficiente memoria tanto como usted solicitó.
Ya sabe cuánta memoria solicitó para poder calcular la longitud fácilmente. Puedes encontrar el tamaño de cada artículo usando sizeof
.
Total memory requested / Memory required for 1 item = No of Items
¿Por qué no es posible obtener la longitud de un búfer asignado de esta manera?
AType * pArr = new AType[nVariable];
Cuando la misma matriz se desasigna
delete [] pArr;
el tiempo de ejecución debe saber cuánto desasignar. ¿Hay algún medio para acceder a la longitud antes de eliminar la matriz. Si no, ¿por qué no se proporciona dicha API que alcance la longitud?
¿Por qué no un poco de información adicional como esta:
template <typename T> class AType
{
public:
AType(size_t s) : data(0)
{
a_size = s;
data = new T[s];
}
~AType() {
if (data != nullptr)
delete [] data;
}
size_t getSize() const
{
return a_size * sizeof(T);
}
private:
size_t a_size;
T* data;
};
El operador de delete
no necesita saber el tamaño para liberar la memoria asignada, al igual que la llamada free
sistema. Esto se debe a que ese problema se deja al sistema operativo y no al sistema de tiempo de ejecución de los compiladores.
El tiempo de ejecución SÍ sabe cuánto se asignó. Sin embargo, tales detalles son específicos del compilador, por lo que no tiene ninguna forma de plataforma cruzada para manejarlo.
Si desea la misma funcionalidad y puede hacer un seguimiento del tamaño, puede usar un std :: vector de la siguiente manera:
std::vector< AType > pArr( nVariable );
Esto tiene la ventaja adicional de usar RAII también.
El tiempo de ejecución debe desasignar la misma cantidad que asignó, y hace un seguimiento de esto de alguna manera (generalmente muy indirectamente). Pero no hay una manera confiable de obtener de la cantidad asignada a la cantidad de elementos: la cantidad asignada no puede ser menor que la cantidad de elementos multiplicada por el tamaño de cada elemento, pero a menudo será más. Las consideraciones de alineación, por ejemplo, significan que el new char[5]
y el new char[8]
asignarán a menudo la misma cantidad de memoria, y existen varias estrategias de asignación que pueden hacer que se asigne significativamente más memoria que lo estrictamente necesario.
No en realidad no. Al menos no de forma definida, independiente de la plataforma.
Sin embargo, la mayoría de las implementaciones almacenan el tamaño de una matriz asignada dinámicamente antes de la matriz real.
No hay una forma portátil en C ++ para obtener el tamaño de una matriz asignada dinámicamente desde el puntero en bruto.
Bajo MSVC y WIN32 puede obtener el tamaño del bloque asignado con la función _msize (void *).
consulte https://msdn.microsoft.com/en-us/library/z2s077bc.aspx para obtener más detalles.