Considere el siguiente código:¿Por qué no hay advertencia de gcc/g ++ para los temporales no utilizados?
void ListenerImpl::attach(boost::shared_ptr<ISubscriber> subscriber)
{
boost::unique_lock<boost::mutex>(mtx);
subscribers.push_back(subscriber);
}
void ListenerImpl::notify(MsgPtr msg)
{
boost::unique_lock<boost::mutex>(mtx);
//notify all subscribers
BOOST_FOREACH(boost::shared_ptr<ISubscriber> subscriber, subscribers){
subscriber->update(msg);
}
}
(. Esta es una implementación de un patrón de observador como se describe en GoF) La intervención del usuario aquí era proteger el pegado() y el Notify() de ejecución simultánea, de ahí el impulso :: unique_lock. El objetivo era proteger el contenedor subscribers
.
Pero de hecho es extremadamente difícil notar que los bloqueos son de hecho solo temporales (échele un vistazo más de cerca, no hay nombres asignados para ellos). Por lo que el bloqueo en el mutex se liberará inmediatamente, cuando se destruya el temporal, es decir, el código no es seguro para subprocesos. Me esperaba en situaciones como esta una advertencia de compilador. Algo así como "temporal no utilizado".
Peor aún, cppcheck tampoco reconocería este error. (cppcheck: una herramienta de análisis de código c/C++ http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page)
Gcc emite advertencias en variables no utilizadas. El temporal aquí es una variable no utilizada, y definitivamente el resultado de la falta de atención del programador. Entonces, ¿por qué no hay advertencias en casos como este? Tal vez es demasiado complicado descubrir tales situaciones?
Cometí un error similar, compruebe también esta pregunta: http://stackoverflow.com/questions/914861/disallowing-creation-of-the-temporary-objects – Naveen
¿Ha intentado -Wall -Wextra como argumentos de línea de comandos para el compilador? Aunque no estoy familiarizado con C++. – DipSwitch
¿Se garantiza que una variable no modificada (lo que se conoce como * temporal *) se destruya inmediatamente? Hubiera esperado que viviera hasta el final del alcance que se definió. – ereOn