En C++, ¿cuál es la diferencia entreCuál es la diferencia entre el nuevo char [10] y el nuevo char (10)
char *a = new char[10];
y
char *a = new char(10);
Gracias!
En C++, ¿cuál es la diferencia entreCuál es la diferencia entre el nuevo char [10] y el nuevo char (10)
char *a = new char[10];
y
char *a = new char(10);
Gracias!
El primero asigna un arreglo de 10 de Char. El segundo asigna un carbón inicializado a 10.
O:
La primera debería ser sustituida por std::vector<char>
, el segundo debe ser colocado en un puntero inteligente.
¿Podría decirnos sobre punteros inteligentes? –
@Green: Eh, [this] (http://stackoverflow.com/questions/94227/smart-pointers-or-who-owns-you-baby) es un buen comienzo. – GManNickG
+1 de mí. Siempre lo atribuyo a un "ignorante pasajero" cuando veo que hubo un voto anónimo hacia una respuesta perfectamente correcta. –
new char[10];
asigna dinámicamente un char [10] (array de char, longitud 10), con valores indeterminados, mientras
new char(10);
de nuevo, de forma dinámica asigna un único char, con un valor entero de 10.
Bueno, la primera uno hará una matriz. Pero supongo que tu pregunta es principalmente sobre la segunda. Su código se puede utilizar como un carácter válido, considere:
char * x ;
cin >> *(x=new char()) ;
hará un carácter dinámico y luego leer de la entrada estándar.
El hecho de que un objeto tenga un tamaño de uno no significa que sea un char. Además, ¿cómo se puede eliminar esa variable? (No lo asigne dinámicamente cuando no sea necesario). "No olvide eliminar" -> Código de C++ incorrecto. – GManNickG
Tienes razón, pero solo quería mostrarle a nuestro amigo que las personas que crearon C++ lo hicieron con algún propósito. No debería haberlo usado con cin y sin referencias a él. –
char *a = new char[10];
...
delete [] a;
Lo anterior asigna dinámicamente y desasigna 10 ranuras de memoria contiguos que se pueden utilizar para almacenar caracteres.
char *a = new char(10);
...
delete a;
Lo anterior asigna dinámicamente y desasigna una ranura de memoria que se inicializa con el valor entero 10
, equivalente al valor Char '\n'
.
NO utilice el std::vector<T>
si primero no entiende punteros. Saber cómo funcionan los punteros y la asignación de memoria le hará un mejor programador.
¿Qué significa esto sobre las respuestas existentes? Y su segunda mitad es puramente opinión, y realmente bastante desagradable en la comunidad moderna de C++. Es mejor entregar cajas negras a las personas, * luego * mostrarles cómo funciona y por qué las usamos. La administración manual de la memoria es mala C++ de todos modos, ¿por qué empezar enseñando a las personas mal C++? – GManNickG
10 espacios de memoria son contiguos, comenten en std :: vector, (char) 10 == '\ n' ~~ No me voten solo porque hiere sus sentimientos. – Squirrelsama
Has editado en la segunda mitad, he editado mi comentario para que coincida. Además, las tres respuestas existentes dicen que es una "matriz". Las matrices son siempre contiguas. Además, ''\ n'' no necesariamente tiene que ser 10, depende de tu conjunto de caracteres. – GManNickG
Prefiero usar:
size_t size = 10; //or any other size
std::string buff(size, 0); //or: std::string buff(size, '\0');
Ahora bien, si debe utilizar el char * piel de ante, entonces usted puede utilizar:
&buff[0]
Cuando es necesario utilizar const char *, puede utilizar :
buff.c_str()
la gran ventaja es que no es necesario desasignar la memoria, STL hacerse cargo de esto para usted. La siguiente ventaja es que puede usar todas las funciones stl string
Vea también: http://stackoverflow.com/questions/2029651/how-do-you-initialise-a-dynamic-array-in-c – slashmais