在调用过程中删除 std::函数
Deleting a std::function in the middle of invocation
在调用过程中销毁/删除 std::function 是未定义的行为吗?
class Event {
public:
Event(std::function<void()> f) : func(std::move(f)) {}
~Event() {}
std::function<void()> func;
};
int main()
{
std::vector<Event> events;
auto func = [&]() {
events.pop_back();
std::cout << "event" << std::endl;
// do more work
};
events.emplace_back(std::move(func));
events[0].func();
return 0;
}
这是由 [res.on.objects]p2 未定义的:
如果访问了标准库类型的对象,并且开头 对象的生存期不会在访问之前发生,或者 在对象的生存期结束之前不会进行访问,即 除非另有指定,否则行为是未定义的。
在这种情况下,"访问"包括对std::function
函数调用运算符的调用。std::function
对象的生存期在访问过程中的pop_back()
调用处结束。因此,访问不会在对象的生存期结束之前发生,并且行为是未定义的。
你的代码(你问的位,即成员函数内对象的破坏(大致等效于
struct A
{
void f() { delete this; }
}
int main()
{
A* a = new A;
a.f();
}
这确实有效。当引用计数在其unref
函数中达到零时,引用计数资源可以执行类似操作。
请注意,您可能需要重新考虑像这样将事件列表和事件本身捆绑在一起。事件不应知道其环境(事件队列(。
相关文章:
- 无法引用该函数" std:: variant <_Types...> operator =",因为此函数已被删除
- 错误:使用已删除的函数"std::unique_ptr<...>
- 我有模板功能.通过使用函数std::for_each,用这个容器中的最大数字替换每个正数
- 如何使用函数std::min()来计算最小值
- 删除了 g++ 在 linux 中basic_stringstream函数 std
- 如何在 c++ 中使用返回类型导出函数 std::map
- 错误:使用已删除的函数"std::atomic<_Tp>::atomic() [_Tp = node]"
- 使用 SFINAE 检查函数 std::to_string 是否存在类型
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 为什么函数 std::basic_streambuf::setg() 需要非常量 agruments
- C++将已删除的函数 std::unique_ptr 与基类一起使用
- 奇怪的错误:当没有真正创建指针时,使用已删除的函数'std::unique_ptr<_Tp,_Dp>::unique_ptr
- 通过模板构造函数(std ::功能和迷你案例)将构造函数触发
- 错误:使用已删除的函数"std::atomic<_Tp>::atomic()
- 错误:使用已删除的函数std::basic_ofstream(OpenCV和C++11)
- 类成员容器迭代器在成员函数std::find中不兼容,但为什么不兼容呢
- 没有构造函数 std::istream_iterator 的实例
- 错误:没有与参数列表匹配的重载函数"std::make_shared"实例
- 错误:使用已删除的函数"std::thread::thread(const std::thread&)"
- 不能在没有对象的情况下调用成员函数 std::string class::function()