<返回更多

C++代码赏析:回调中对象保活

2023-01-12  今日头条  骇客遇见AI
加入收藏

概念

 

例子1

您可能希望将this指针捕获到c++ lambda中,但这将捕获原始指针。如果需要延长对象的生命周期,则需要捕获强引用。“捕获对自己的强引用”的常见模式是同时捕获强引用和原始this。强引用保持this为活的,并且使用this方便访问成员。

#include <functional>
#include <IOStream>
#include <memory>
#include <string>

std::vector<std::function<void(void)>> actions;

class Widget : public std::enable_shared_from_this<Widget> {    
public:
    Widget(const std::string name){name_ = name;}
    void reg() {
        // std::shared_ptr
        auto callback = [lifetime = shared_from_this(),  this]() {
                    action(name_);  
        };
        actions.push_back(callback); 
    }

    virtual void action(std::string name) {
        std::cout << "widget action:" << name << std::endl;
    }
    std::string name_;
};
class Table : public Widget {                     
public:
    Table(const std::string name):Widget(name){}
    virtual void action(std::string name) {
        std::cout << "table action:" << name << std::endl;
    }
};

void reg_action() {
    auto widget = std::make_shared<Widget>("widget");                             
    widget->reg();
    auto table = std::make_shared<Table>("table");                             
    table->reg();
}

int main(int argc, char* argv[]) {
    reg_action();
    for (const auto& action : actions) {
        action();
    }
}

输出:

widget action:widget
table action:table

在线测试

https://wandbox.org/permlink/HDrKO6Hn6tROiVEj

例子2

#include <functional>
#include <iostream>
#include <memory>

std::vector<std::function<void(void)>> actions;

class Widget : public std::enable_shared_from_this<Widget> {                     
public:
    void reg() {
        actions.push_back(std::bind(&Widget::action, shared_from_this())); 
    }

    virtual void action() {
        std::cout << "widget action" << std::endl;
    }
};

class Table : public Widget {                     
public:
    virtual void action() {
        std::cout << "table action" << std::endl;
    }
};

void reg_action() {
    auto widget = std::make_shared<Widget>();                             
    widget->reg();
    auto table = std::make_shared<Table>();                             
    table->reg();
}

int main(int argc, char* argv[]) {
    reg_action();
    for (const auto& action : actions) {
        action();
    }
}

输出:

widget action
table action
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>