2010-07-12 10 views
23

Tengo algunas lagunas en la comprensión del método string::assign. Considere el siguiente código:¿std :: string :: assign toma "propiedad" de la cadena?

char* c = new char[38]; 
strcpy(c, "All your base are belong to us!"); 
std::string s; 
s.assign(c, 38); 

¿Se s.assign asignar un nuevo buffer y copiar la cadena en él o ella asume la propiedad del puntero; es decir, no asigna nueva memoria y usa directamente mi dirección. Si se copia, ¿cuál es la diferencia entre assign y operator=? Si no se copia, ¿libera la memoria o es mi responsabilidad?

Gracias.

+1

No hay forma de que un 'std :: string' se apropie de un puntero que tenga, period :( –

Respuesta

29

Asigna a la vez un nuevo buffer y copia la cadena en él o asume la propiedad del puntero;

El método de cadena STL assign copiará la matriz de caracteres en la cadena. Si el búfer ya asignado dentro de la cadena es insuficiente, reasignará la memoria internamente. La cadena STL será no tomará posesión de la matriz original.

Si se copia, ¿cuál es la diferencia entre assign y operator =?

Ambos deben actuar de la misma manera, pero hay una serie de sobrecargas en el método de asignación de STL que le dan más control sobre lo que sucede. Eche un vistazo a this page para más información.

ACTUALIZACIÓN: El MSDN has a number of examples de las diversas sobrecargas assign.

Si no se copia, ¿libera la memoria o es mi responsabilidad?

No, el puntero original de la matriz de caracteres sigue siendo su responsabilidad.

1

Por lo que puedo recordar, depende de la implementación de su compilador. Algunos pueden usar optimizaciones de copia sobre escritura y, por lo tanto, no crean ninguna copia hasta que modifique el valor. Sin embargo, la mayoría de las implementaciones solo copiarán la cadena.

Pero, todas las implementaciones se encargarán de la limpieza, por lo que no es necesario que libere manualmente la memoria de cadenas (de eso se tratan los objetos de cadena). Por supuesto, debe liberar sus objetos de cadena, si se crean en el montón (o usar un smartpointer);)

Asignar y operador = pueden implementarse en términos de otros ya que hacen lo mismo, dependiendo de qué se llama a la versión de asignación (para todas las sobrecargas, ver cpp reference).

+1

Copy-on-write solo se puede usar cuando se asigna una cadena a otra; no se puede utilizado al asignar un char *. –

15

Copia. La diferencia entre assign y operator= es que puede especificar el número de caracteres que se copiarán incluyendo los caracteres nulos. El operador = simplemente copia la cadena hasta el primer byte nulo.

Cuestiones relacionadas