utiliza sirve resueltos que para memoria ejercicios ejemplos ejemplo dinamicos dinamica como arreglos c++ new-operator realloc delete-operator

sirve - ¿Cómo ''realloc'' en C++?



memoria malloc (4)

El cambio de tamaño en C ++ es incómodo debido a la posible necesidad de llamar a constructores y destructores.

No creo que haya una razón fundamental por la cual en C ++ no se pueda tener un operador de cambio de resize[] para ir con new[] y delete[] new[] , que hicieron algo similar a esto:

newbuf = new Type[newsize]; std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf); delete[] oldbuf; return newbuf;

Obviamente, el oldsize se recuperaría de una ubicación secreta, igual que en delete[] , y Type vendría del tipo del operando. resize[] fallaría si el Tipo no se puede copiar, lo cual es correcto, ya que dichos objetos simplemente no se pueden reubicar. Finalmente, el código anterior predeterminado: construye los objetos antes de asignarlos, lo que no le gustaría como el comportamiento real.

Hay una posible optimización donde newsize <= oldsize , para llamar a los destructores de los objetos "pasados ​​el final" de la nueva matriz ensmallened y no hacer nada más. El estándar debería definir si esta optimización es necesaria (como cuando resize() un vector), permitido pero no especificado, permitido pero dependiente de la implementación o prohibido.

La pregunta que debe hacerse entonces es: "¿es realmente útil proporcionar esto, dado que el vector también lo hace, y está diseñado específicamente para proporcionar un contenedor redimensionable (de memoria contigua? Ese requisito se omite en C ++ 98). pero se corrigió en C ++ 03) que es una mejor opción que las matrices con las formas C ++ de hacer las cosas ".

Creo que la respuesta es ampliamente considerada como "no". Si quiere hacer búferes malloc / free / realloc forma C, use malloc / free / realloc , que están disponibles en C ++. Si quiere hacer un búfer redimensionable al estilo C ++, use un vector (o deque , si realmente no necesita almacenamiento contiguo). No intente mezclar los dos usando new[] para buffers sin formato, a menos que esté implementando un contenedor similar a un vector.

¿Cómo puedo realloc en C ++? Parece que falta en el idioma - ¡hay new y delete pero no resize !

Lo necesito porque como mi programa lee más datos, necesito reasignar el buffer para mantenerlo. No creo que la opción correcta sea delete el puntero anterior y crear uno nuevo y más grande.


La opción correcta es probablemente usar un contenedor que haga el trabajo por usted, como std::vector .

new y delete no pueden cambiar de tamaño, ya que asignan la memoria suficiente para contener un objeto del tipo especificado. El tamaño de un tipo dado nunca cambiará. Hay new[] y delete[] pero casi nunca hay una razón para usarlos.

Lo que realloc en C es probable que sea solo un malloc , memcpy y free , de todos modos, aunque los administradores de memoria pueden hacer algo inteligente si hay suficiente memoria libre contigua disponible.


Use :: std :: vector!

Type* t = (Type*)malloc(sizeof(Type)*n) memset(t, 0, sizeof(Type)*m)

se convierte

::std::vector<Type> t(n, 0);

Entonces

t = (Type*)realloc(t, sizeof(Type) * n2);

se convierte

t.resize(n2);

Si desea pasar el puntero a la función, en lugar de

Foo(t)

utilizar

Foo(&t[0])

Es un código C ++ absolutamente correcto, porque el vector es una matriz C inteligente.


prueba algo como eso:

typedef struct Board { string name; int size = 0; }; typedef struct tagRDATA { vector <Board> myBoards(255); // Board DataBoard[255]; int SelectedBoard; } RUNDATA;

Vector se quejará. Es por eso que todavía existen arreglos, malloc y nuevos.