¿Qué tan seguros y confiables son los C ++ String Literals?

Por lo tanto, quiero comprender mejor cómo funcionan los literales de cadena en C ++. Me preocupan principalmente las situaciones en las que asigna la dirección de una cadena literal a un puntero y la pasa. Por ejemplo:

char* advice = "Don't stick your hands in the toaster.";

Ahora digamos que solo paso esta cadena copiando punteros durante la duración del programa. Claro, probablemente no sea una buena idea, pero tengo curiosidad por saber qué pasaría realmente detrás de escena.

Para otro ejemplo, digamos que hacemos una función que devuelve una cadena literal:

char* foo()
{
    // function does does stuff
    return "Yikes!"; // somebody's feeble attempt at an error message
}

Ahora digamos que esta función se llama con mucha frecuencia, y el literal de cadena solo se usa aproximadamente la mitad del tiempo que se llama:

// situation #1: it's just randomly called without heed to the return value
foo(); 

// situation #2: the returned string is kept and used for who knows how long
char* retVal = foo();

En la primera situación, ¿qué está pasando realmente? ¿Se acaba de crear la cadena pero no se usa y nunca se desasigna?

En la segunda situación, ¿se mantendrá la cadena siempre que el usuario la necesite? ¿Qué sucede cuando ya no se necesita ... entonces se liberará esa memoria (suponiendo que ya nada señale ese espacio)?

No me malinterpreten, no estoy planeando usar literales de cadena como este. Estoy planeando usar un contenedor para mantener mis cadenas bajo control (probablemente std :: string). Principalmente solo quiero saber si estas situaciones pueden causar problemas, ya sea para la administración de la memoria o los datos dañados.