gpt4 book ai didi

c++ - 为什么我不能用 deleter 创建这个 unique_ptr?

转载 作者:太空狗 更新时间:2023-10-29 20:42:17 26 4
gpt4 key购买 nike

我在使用 SDL 时遇到了一个我无法解决的问题。我想将纹理(指向结构的指针)保留在 std::map 中我在哪里使用 std::string作为键和 std::unique_ptr<texture, void(*)(texture*)>作为值(value)。我必须在 std::unique_ptr 中使用删除器,因为纹理必须由某个函数释放。纹理也是由另一个函数创建的。我将代码简化为以下内容:

#include <map>
#include <memory>

int* new_int(){ return new int; }
void delete_int(int* p){ delete p; }

typedef std::unique_ptr<int, void(*)(int*)> int_ptr;

int main()
{
std::map<int, int_ptr> the_map;
the_map[1] = int_ptr(new_int(), delete_int);
return 0;
}

当我尝试在 Visual Studio 2012 中编译此代码时,出现以下错误:

error C2338: unique_ptr constructed with null deleter pointer.

我觉得很奇怪,因为我提供了 delete_int作为删除指针。欢迎任何帮助,不同的方法也是如此。提前致谢!

最佳答案

这是因为使用 map::operator[] 要求值类型是默认可构造的,而 unique_ptr 在这种情况下不是。指向unique_ptr对象的存储指针可能为空,但删除器,如果它是一个指针,则可能不为0。您可以通过

检查
the_map[1];

甚至只是

int_ptr p;

这会给你完全相同的错误。

解决方案是使用std::map::emplace :

the_map.emplace(1, int_ptr(new_int(), delete_int));

如果由于您的环境中未实现而无法实现,您可以使用 std::map::insert :

the_map.insert(std::make_pair(1, int_ptr(new_int(), delete_int)));

或更冗长但稍微更有效

the_map.insert(std::map<int, int_ptr>::value_type(1, int_ptr(new_int(), delete_int)));

关于c++ - 为什么我不能用 deleter 创建这个 unique_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19207999/

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