gpt4 book ai didi

c++ - 对使用 unique_ptr 和自定义删除器感到困惑

转载 作者:可可西里 更新时间:2023-11-01 18:18:31 24 4
gpt4 key购买 nike

我正在尝试使用 unique_ptr使用 SDL_Surface 的自定义删除器类型。这只是一个使用 int 的示例打字,但我希望你明白了。

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

typedef int SDL_Surface;


SDL_Surface * CreateSurface()
{
SDL_Surface * p = new SDL_Surface;
return p;
}

void FreeSurface(SDL_Surface *p)
{
delete p;
}

int main() {
std::unique_ptr<SDL_Surface, std::function< void (SDL_Surface *) > > uptr_1;

//how to assign a value to uptr_1 and the deleter?

return 0;
}

uptr_1正确声明并初始化为 nullptr ?如果是这样,我该如何分配指针和删除函数?

我该如何封装它: std::unique_ptr< SDL_Surface, std::function< void (SDL_Surface *) > >使用删除器并不总是在每个 SDL_Surface 上写那一行我想要另一个 typedef?

我刚开始学习 C++11 的特性,这对我来说很难。

最佳答案

您可以初始化 unique_ptr使用指针和删除器,或使用 =通常如果稍后重新分配:

std::unique_ptr<SDL_Surface, std::function<void (SDL_Surface *)>> uptr_1(CreateSurface(), &FreeSurface);

uptr_1 = std::unique_ptr<SDL_Surface, std::function<void (SDL_Surface *)>>(CreateSurface(), &FreeSurface);

引用suitable docs了解详情。

要缩短 long 类型,您确实可以使用类型别名( typedefusing ):

typedef std::unique_ptr<SDL_Surface, void (*)(SDL_Surface*)> Surface_ptr;

//or

using Surface_ptr = std::unique_ptr<SDL_Surface, void (*)(SDL_Surface*)>;

注意我实际上使用了 void (*)(SDL_Surface*)对于删除器类型。如果你知道你总是会传递一个实际的函数(或无状态的 lambda),就没有理由拖入 std::function ,由于类型删除,它有一些开销。

此外,您可以通过为删除器创建一个默认可构造的仿函数来进一步缩短它:

struct FreeSurface_Functor
{
void operator() (SDL_Surface *s) const
{
FreeSurface(s);
}
};

这样,您就可以将指针的类型设置为 std::unique_ptr<SDL_Surface, FreeSurface_Functor> (可能是别名)并且您不必提供删除程序;它将是默认构造的:

std::unique_ptr<SDL_Surface, FreeSurface_Functor> uptr_1(CreateSurface());

关于c++ - 对使用 unique_ptr 和自定义删除器感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28609454/

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