【发布时间】:2018-11-12 22:16:22
【问题描述】:
这是明确定义的行为吗?
#include <functional>
void foo() {
auto f = new std::function<void()>;
*f = [f]() { delete f; };
(*f)();
f = nullptr;
}
int main() {
foo();
}
使用最新的 g++,如果我在模板中执行此操作,则会在 valgrind 下运行时导致无效读取,否则它可以正常工作。为什么?这是 g++ 的错误吗?
#include <functional>
template<std::size_t>
void foo() {
auto f = new std::function<void()>;
*f = [f]() { delete f; };
(*f)();
f = nullptr;
}
int main() {
foo<0>();
}
【问题讨论】:
-
@alphashooter 你能证明吗?规范在哪里说这具有未定义的行为?
-
@SanJacinto 标准不需要说删除
std::function是已定义的行为。默认情况下(因为删除std::string也是如此)。如果这是未定义的行为,IMO 应该需要明确声明在调用绑定函数对象期间删除对象是未定义的。 -
@JohannesSchaub-litb 删除
std::function不是,但是如何在std::function拥有的 lambda 中删除呢? -
@alphashooter 在这一点上,这种做法的用处对我来说毫无意义。这个问题更多是出于好奇而不是出于实用性。
-
@clin18 好吧,在这种情况下,我可以说以下内容。在您的示例中,在调用期间删除
std::function不是一个好方法。您可以直接或不直接删除对象的唯一一种情况是,当您确定该对象将永远不会被使用时。没有非静态成员函数调用,没有访问它的字段,什么都没有。如果您确定所有这些条件都成立,那么您可以在任何其他情况下使用它——您不应该这样做。
标签: c++ c++11 lambda std-function