自定义删除程序中用于智能共享指针的隐式指针参数

问题描述

我想问一个有关C ++中自定义删除器的问题。

我一直在学习OOP和智能指针,以初始化和删除堆上指针所指向的对象。

#include <iostream>
#include <memory>

class Test {
private:
    int data;
public:
    test() : data {0} {std::cout << "\tTest constructor (" << data << ")" << std::endl;}
    Test(int data): data{data} {std::cout << "\tTest constructor (" << data << ")" << std::endl;}
    int get_data () const {return data;}
    ~test() {std::cout << "\tTest destructor (" << data << ")" << std::endl;}
};

void my_deleter (Test *ptr) {
    std::cout << "\tUsing my custom function deleter" << std::endl;
    delete ptr;
}

int main () {
 {
     // using a function
    std::shared_ptr<Test> ptr1 {new Test {100},my_deleter};
 }   
    std::cout << "====================" << std::endl;
    {
        // using a lambda
        std::shared_ptr<Test> ptr2 {new Test {1000},[] (Test *ptr) {
            std::cout << "\tUsing my custom lambda deleter" << std::endl;
            delete ptr;}
    };
    return 0;
}
}

如果您查看函数my_deleter,它将需要一个Test类型的参数和一个指针。

但是,当在智能指针初始化中执行代码时,指针本身不会作为参数传递。

std::shared_ptr<Test> ptr1 {new Test {100},my_deleter};

在这里很困惑。

为什么这里没有传入任何参数,但是代码仍然输出我需要的内容

输出

    Test constructor (100)
    Using my custom function deleter
    Test destructor (100)
====================
    Test constructor (1000)
    Using my custom lambda deleter
    Test destructor (1000)

我的猜测是,类似于OOP,其中this指针在C ++中是隐式的,当自定义删除器超出范围后调用智能删除器时,智能指针对象也是隐式的,但是我发现没有任何东西可以支持声明。

为什么不需要在智能指针初始化中为删除程序提供参数?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)