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.