tengo código como este:¿Cuál es el constructor predeterminado para el puntero de C++?
class MapIndex
{
private:
typedef std::map<std::string, MapIndex*> Container;
Container mapM;
public:
void add(std::list<std::string>& values)
{
if (values.empty()) // sanity check
return;
std::string s(*(values.begin()));
values.erase(values.begin());
if (values.empty())
return;
MapIndex *mi = mapM[s]; // <- question about this line
if (!mi)
mi = new MapIndex();
mi->add(values);
}
}
La principal preocupación que tengo es si el mapm [s] expresión devolvería referencia a puntero nulo si se añade nuevo elemento al mapa?
El SGI docs decir esto: data_type & operador [] (key_type const & k) Devuelve una referencia al objeto que está asociado con una clave particular. Si el mapa aún no contiene dicho objeto, el operador [] inserta el objeto predeterminado tipo_datos().
Por lo tanto, mi pregunta es si la inserción de objeto data_type predeterminado() creará un puntero NULL, o podría crear un puntero no válido apuntando en algún lugar de la memoria?
No me importa que no sea válido, pero quiero que sea "seguro". Puede verificar fácilmente 0 puntero y puede llamar "eliminar" en él. ¿Alguna referencia (URL) para leer sobre esto? –
No tengo una referencia a mano. Pero estoy bastante seguro de que un constructor de puntero lo inicializará en 0 (al igual que todos los tipos integrales, como 'int',' short', ...). –
C++ Standard, 8.5 párrafo 5: 'Para inicializar por defecto un objeto de tipo T significa: de lo contrario (ni no POD ni matriz), el objeto se inicializa en cero.' Solo unas líneas arriba: 'Inicializar a cero un objeto de tipo T significa: si T es un tipo escalar (3.9), el objeto se establece en el valor de 0 (cero) convertido a T;' En la misma norma, 3.9, párrafo 10: 'Tipos aritméticos (3.9.1), tipos de enumeración, tipos de puntero y puntero a tipos de miembro (3.9.2), [...] se denominan colectivamente tipos escalares'. Así que sí, un puntero se inicializará por defecto a 0. –