2011-07-01 12 views
5

posible duplicado:
delete[] supplied a modified new-ed pointer. Undefined Behaviour?delete [] Matriz de caracteres

Digamos que hemos asignado un puñado de caracteres usando new char[number].

¿Será posible eliminar solo unos pocos caracteres finales (algo así como delete[] (charArray + 4);, que supuestamente desasignará todos los caracteres excepto los cuatro primeros)?

leí que algunas implementaciones new[] tienda del número de objetos asignados antes de la gran variedad de objetos para que delete[] sabe cuántos objetos para desasignar, por lo que probablemente inseguro para hacer lo que te pido ...

Gracias.

EDIT:

está eliminando manualmente los bytes finales no deseados usando delete declaraciones separadas una manera segura de hacer lo que estoy pidiendo?

Respuesta

1

La única manera "segura" de hacerlo es asignar una nueva matriz, copiar los datos y eliminar la antigua. O simplemente puede seguir la forma std::vector y diferenciar entre "capacidad" (el tamaño de la matriz) y "tamaño" (la cantidad de elementos en ella).

+0

¿Podría explicar un poco más en el camino 'std :: vector' lo hace? – slartibartfast

+0

@myrkos Asigna espacio para almacenar * n * elementos, pero podría informar su tamaño como * <= n *. Esto es para que el redimensionamiento sea más eficiente. – Maxpm

+0

@myrkos: asigna el espacio "en bruto" con ':: operator new', y luego utiliza la colocación' new' para convertir ese espacio en bruto en objetos. Cuando necesita destruir objetos (por ejemplo, cuando el 'vector' sale del alcance o usted' borra' los elementos) invoca el dtor directamente para hacerlo. –

6

No, tienes que delete[] exactamente el mismo puntero que obtienes con new[].

0

No, solo puede eliminar toda la matriz.

2

No puede eliminar un segmento específico de una matriz.

Si solo está operando en cadenas C, puede establecer un carácter en \0 y cualquier función que opere en la cadena se detendrá allí, ya que las cadenas C tienen terminación nula.

Si realmente necesita liberar esa memoria, lo más cercano que puede obtener sería crear una nueva matriz más pequeña, copiar los elementos y delete[] la matriz anterior.

char* TenCharactersLong = new char[10]; 
// ... 
char* FirstFiveCharacters = new char[5]; 
for (std::size_t Index = 0; Index < 5; Index++) 
{ 
    FirstFiveCharacters[Index] = TenCharactersLong[Index]; 
} 
delete[] TenCharactersLong; 
1

No, lo siento. La asignación de memoria es lo suficientemente compleja como para la fragmentación, la alineación, el relleno, los gastos generales, etc. Una característica como esta solo amplificaría aún más estos problemas.

¿Borrar manualmente los bytes finales no deseados utilizando las instrucciones de eliminación por separado es una forma segura de hacer lo que estoy pidiendo?

Ni lo intentes. Esto puede ser peligroso. Siempre desasigne las matrices con delete [].

Te recomiendo la lectura del C++ FAQ Lite en este tema: 16.13, 16.14

0

No, usted no puede hacer eso. Sugeriría usar un std :: vector para esto.De esta forma, puede identificar los índices que desea eliminar y dejar que las bibliotecas lo manejen por usted.

Cuestiones relacionadas