gpt4 book ai didi

c++ - 有没有办法检查 std::function 是否指向有效对象的成员?

转载 作者:太空宇宙 更新时间:2023-11-04 14:54:29 26 4
gpt4 key购买 nike

让我证明我的意思。

#include <functional>
#include <iostream>

class MyClass
{
private:
int number;
public:
MyClass()
{
number = 0;
}

void printNumber()
{
std::cout << "number is " << number << std::endl;
number++;
}
};

int main()
{
std::shared_ptr<MyClass> obj = std::make_shared<MyClass>();
auto function = std::bind(&MyClass::printNumber, obj);

function();

// This deallocates the smart pointer.
obj.reset();

// This shouldn't work, since the object does not exist anymore.
function();

return 0;
}

这个输出:

number is 0
number is 1

如果我们像往常一样调用函数,将“function()”替换为“obj->printNumber()”,输出为:

number is 0
Segmentation fault: 11

就像您期望的那样。

所以我的问题是,是否有任何方法可以确保在对象已被释放时我们无法调用该函数?这与使用智能指针无关,它与常规指针的工作方式相同。

最佳答案

您的代码有效。

obj.reset() 不会释放共享的 MyClass 对象,因为共享指针 obj 的拷贝存在于绑定(bind)中表达式函数。这是因为 std::bind 复制(或移动)它的参数,除非包装在 reference_wrapper 中(例如通过 std::ref)。

如果您在 MyClass 的析构函数上检测或放置断点,您会发现它直到 main 结束时才被调用,当局部变量 函数被破坏。

关于c++ - 有没有办法检查 std::function 是否指向有效对象的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25410228/

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