C++ 当我们添加任何数据类型时,unique\u ptr占用了太多的空间

C++ 当我们添加任何数据类型时,unique\u ptr占用了太多的空间,c++,std,smart-pointers,C++,Std,Smart Pointers,当我只添加一个字符时,为什么这个程序的输出是48 当我只添加一个字符时,为什么这个程序的输出是48 因为您指定的删除器包含一个int、一个float和4个double。该删除器存储为唯一指针的子对象 请注意,由于删除程序不满足必要的要求,因此这种唯一指针在一开始就不起作用。特别是,它不接受传递给它的参数。您认为std::unique\u ptr是什么?特别是,每个模板参数代表什么?删除程序将泄漏分配的字符。这将产生硬错误,因为deleter没有正确的签名operator@Jarod42sizeo

当我只添加一个字符时,为什么这个程序的输出是48

当我只添加一个字符时,为什么这个程序的输出是48

因为您指定的删除器包含一个int、一个float和4个double。该删除器存储为唯一指针的子对象


请注意,由于删除程序不满足必要的要求,因此这种唯一指针在一开始就不起作用。特别是,它不接受传递给它的参数。

您认为std::unique\u ptr是什么?特别是,每个模板参数代表什么?删除程序将泄漏分配的字符。这将产生硬错误,因为deleter没有正确的签名operator@Jarod42sizeof是否考虑了功能?我对此表示怀疑。@πάνταῥεῖ: sizeof实际上是一个未经评估的上下文,因此没有实例化任何方法。关于无效删除器的注释是针对实际实例化和使用它的时间。我刚刚指出无效性是内存泄漏之前的编译错误。@Jarod42很好。我改写了一点。
#include <iostream>
#include <memory>

int main() {
    int i = 0;
    float f = 0.0f;
    double d1 = 0.0, d2 = 0.0, d3 = 0.0, d4 = 0.0;

    auto a = [i,f,d1,d2,d3,d4](){};

    std::cout << sizeof(std::unique_ptr<decltype(a)>) << std::endl;       //  8
    std::cout << sizeof(std::unique_ptr<char, decltype(a)>) << std::endl; // 48

    return 0;
}