gpt4 book ai didi

c++ - 为 std::shared_ptr 分配内存的正确方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:43 24 4
gpt4 key购买 nike

我已经实现了一个功能,在这个功能中,身份是交给我的,不受我的控制。它返回 std::shared_ptr<const void> .在函数中,我分配了任意数量的内存,并通过 shared_ptr 返回对它的访问。

我的内存分配是用 new unsigned char[123] 完成的.问题是 valgrind 检测到新变体和删除变体的使用不匹配。当我使用 new[](unsigned)为了分配内存,shared_ptr 析构函数使用 delete(void*)释放它,每当您使用“不正确”的分配器进行分配时,valgrind 都会发出警告。

更实际地说,我写了这个测试用例来说明我的意思:

TEST(Example, Test1)
{
unsigned char* mem = new unsigned char[123];
std::shared_ptr<const void> ptr(mem);
}

valgrind 报告说

==45794== Mismatched free() / delete / delete []
==45794== at 0x4C2A64B: operator delete(void*) (vg_replace_malloc.c:576)
==45794== by 0x40B7B5: _M_release (shared_ptr_base.h:150)
==45794== by 0x40B7B5: ~__shared_count (shared_ptr_base.h:659)
==45794== by 0x40B7B5: ~__shared_ptr (shared_ptr_base.h:925)
==45794== by 0x40B7B5: ~shared_ptr (shared_ptr.h:93)
==45794== by 0x40B7B5: Example_Test1_Test::TestBody() (test.cc:108)
==45794== Address 0x5cb6290 is 0 bytes inside a block of size 123 alloc'd
==45794== at 0x4C29CAF: operator new[](unsigned long) (vg_replace_malloc.c:423)
==45794== by 0x40B72E: Example_Test1_Test::TestBody() (test.cc:107)

如果可能,我想避免使用 valgrind 过滤器。

分配任意数量的数据并作为 std::shared_ptr<const void> 返回的正确方法是什么? ?

最佳答案

如果你给shared_ptr<T>一个T指针,它假定您创建了一个对象并暗示删除器 delete p; .如果你的分配实际上是用 array-new 执行的,你需要传递一个适当的删除器来执行 delete[] p; .您可以重复使用 std::default_delete如果你喜欢:

return static_pointer_cast<const void>(
std::shared_ptr<unsigned char>(
new unsigned char[N],
std::default_delete<unsigned char[]>()));

(您甚至不需要外部转换,因为转换是隐含的。)

在 C++17 中,shared_ptr支持数组,所以你可以说

shared_ptr<unsigned char[]>(new unsigned char[N])

那里并获得正确的删除器(然后转换为 void)。

关于c++ - 为 std::shared_ptr 分配内存的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42663978/

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