gpt4 book ai didi

c++ - std::function 的对象何时被销毁?

转载 作者:行者123 更新时间:2023-12-02 19:04:16 27 4
gpt4 key购买 nike

std::function的对象被毁了?为什么指向std::function对象的指针当变量 fn1 时仍然有效超出了范围(你看代码片段运行良好,http://cpp.sh/6nnd4)

// function example
#include <iostream> // std::cout
#include <functional> // std::function, std::negate

// a function:
int half(int x) {return x/2;}

int main () {
std::function<int(int)> *pFun;

{
std::function<int(int)> fn1 = half; // function

pFun= &fn1;
std::cout << "fn1(60): " << (*pFun)(60) << '\n';
}

std::cout << "fn1(60): " << (*pFun)(90) << '\n';

return 0;
}

最佳答案

简短的回答是 C++ 不验证指针的内容。这是开发商的责任。它仅验证变量 pFun 是否在范围内。

在 C++ 中,开发人员通常有责任确保他们的指针指向有效的对象。在这种情况下,fn1 可能已在堆栈上创建。因为许多编译器都以这种方式实现局部变量。当fn1超出范围时,编译器将不再允许使用变量fn1。但是,支持 fn1 的堆栈上的内存会发生什么情况尚未定义。在您的情况下,编译器保持不变,因此 (*pFun)(90) 碰巧仍然有效。但是,在另一个编译器上运行相同的代码可能不会。事实上,简单地打开编译器优化可能会导致它停止工作。这完全取决于编译器是重用该内存,还是从堆栈中释放它。

在您的示例中,范围是一个代码块。如果作用域是一个名为 MyFunction2 的单独函数,那么当 MyFunction2 退出时,与 fn1 关联的堆栈内存将被从堆栈中释放,并且可重用的内存。通过中断和在 MyFunction2 之后调用的任何代码。因此,数据更有可能已被更改,从而导致 (*pFun)(90) 出现故障。

现在调试像这样的崩溃是相当困难的。想象一下,如果您改为写入 pFun,这将导致在 fn1 超出范围后恰好使用该内存的任何对象发生内存损坏。

关于c++ - std::function 的对象何时被销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65260902/

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