Viniendo de un mundo C#, estoy luchando para asegurarme de no introducir pérdidas de memoria y errores en un proyecto C++ al que he sido asignado. Estoy escribiendo código que usa estructuras para analizar información de un buffer de datos. Debido a que la cantidad de estructuras de datos que aparecen en el búfer puede variar en tiempo de ejecución, se usa un vector stl para almacenar los datos procesados. Me encontré con el siguiente bloque de código en el software existente, y estoy luchando para entender por qué funciona:Administrar el alcance y el objeto de por vida dentro de los vectores STL
MyVectorOfObjects.clear();
for (unsigned __int8 i = 0; i < NumberOfObjects; i++)
{
MyParserObject parserObject; // Declaring without 'new'?
parserObject.Decode(buffer, offset, size); // A method on the struct.
MyVectorOfObjects.push_back(parserObject); // Does this keep parserObject in scope?
}
Mis preguntas son específicamente:
- sería
Según this question, no van
parserObject
fuera del alcance cada iteración ya que la palabra clavenew
no se usa? Evidentemente este código ha estado funcionando. En este caso, si coloca el objeto en un
vector
, mantenga elparserObject
en el alcance?De acuerdo con this question, se copia el objeto parserObject. Si este es el caso, ¿cuáles son las implicaciones de rendimiento (por ejemplo, consumo de memoria, asignación de memoria, etc.) de esto? Además, ¿los objetos ParserObjects copiados asumen el mismo alcance que el vector?
Gracias por cualquier ayuda.
Esto es algo básico C++. Recomiendo tomar un [buen libro introductorio de C++] (http://tinyurl.com/so-cxxbooks) y aprender de él.Dicho esto, necesita darse cuenta de una gran diferencia entre C++ y C#: en C++, las variables contienen * valores * (a menos que explícitamente se declaren como referencias, por supuesto), mientras que en C#, la mayoría de las variables contienen * referencias * (por supuesto, sin contar tipos de valor). –
Con 'MyParserObject parserObject;', el programa administra automáticamente la memoria; piense en ello como 'delete parserObject;' justo después del 'for'-loop, aunque esto no necesariamente ocurre en la práctica. –
@ R.Martinho Gracias por la referencia ... y la nota. – bporter