gpt4 book ai didi

c++ - 为什么没有针对未使用的临时文件的 gcc/g++ 警告?

转载 作者:可可西里 更新时间:2023-11-01 15:22:09 27 4
gpt4 key购买 nike

考虑以下代码:

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 中描述的观察者模式的实现。)此处的用户干预是为了防止 attach() 和 notify() 同时运行,因此使用了 boost::unique_lock。目标是保护 subscribers 容器。

但确实很难注意到锁实际上只是临时锁(仔细观察,没有为它们分配名称)。因此,当临时对象被破坏时,互斥体上的锁将立即释放,即代码不是线程安全的。我希望在这种情况下会出现编译器警告。类似于“未使用的临时”。

更糟糕的是,cppcheck 也不会识别这个错误。(cppcheck:一个c/c++代码分析工具http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page)

Gcc 对未使用的变量发出警告。这里的temporary是一个未使用的变量,肯定是程序员不注意的结果。那么,为什么在这种情况下没有警告呢?也许发现这样的情况太复杂了?

最佳答案

编译器不会发出警告,因为您很可能正在更新构造函数中的某些 static-member/global 变量(这是有效且有意义的)。例如:

struct A
{
static int count;
A () { count ++; }
};

现在,当您简单地调用一个临时对象时:

A();

如果这种更新没有发生,编译器将不会深入A 的构造函数并检查是否发生了有用的事情。它总是假设是一个有效的场景。可以指出许多与临时相关的案例。

关于c++ - 为什么没有针对未使用的临时文件的 gcc/g++ 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6518337/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com