考虑下面的代码:为什么没有gcc/g ++警告不使用临时对象?
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);
}
}
(这是如在GoF的描述观察者模式的实现) 用户干预这里是为了保护连接()和所述通知()从同时运行,因此boost :: unique_lock。 目标是保护subscribers
容器。
但确实很难发现这些锁实际上只是临时的(仔细一看,没有为他们指定名称)。 因此,当临时文件被破坏时,互斥锁就会立即释放,即代码不是线程安全的。 我希望在这种情况下编译器警告。像“未使用的临时”。
更糟的是,cppcheck也不会识别这个错误。 (cppcheck:c/C++代码分析工具http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page)
Gcc对未使用的变量发出警告。这里的暂时是一个未使用的变量,肯定是程序员不注意的结果。 那么,为什么在这种情况下没有警告?也许发现这种情况太复杂了?
我做了一个类似的错误,检查这个问题太:http://stackoverflow.com/questions/914861/disallowing-creation-of-the-temporary-objects – Naveen
你尝试了-Wall -Wextra作为命令行参数编译器?虽然我不熟悉C++ .. – DipSwitch
确保一个unamed变量(被称为* temporary *)被立即销毁?我希望它能活到它定义的范围结束。 – ereOn