allocator 相关问题

C ++标准库的一个组件,负责处理容器内存分配和释放请求。

为什么 Rust 中的嵌套分配器会导致堆损坏?

我一直在尝试 Rust allocator_api 功能并开发了一个简单的线性分配器。我的测试用例表明这按预期工作。但是,我希望能够嵌套分配器,例如...

回答 1 投票 0

在c++中使用自定义分配器,将容器分配给迭代器时,会出现什么问题?

我在编译以下代码时遇到了 GCC 抱怨类型不匹配的问题: #包括 #包括 #包括 #包括

回答 1 投票 0

为什么容器比较运算符分配器不可知?

容器的比较运算符需要匹配的分配器类型,例如请参阅 std::vector 比较运算符。 这对我来说似乎没有必要……直觉上,所有操作员都需要……

回答 1 投票 0

自定义分配器和 std::map

这是我可以用 gcc 编译的代码: #包括 #包括 模板 类map_alloc { 民众: typedef std::size_t 大小类型; 类型定义...

回答 1 投票 0

为什么 std::allocator<T>::allocate 调用 ::operator new?

std::allocator::allocate 成员函数的文档说 ([allocator.members]) : 备注:数组的存储是通过调用::operator new ([new.delete...

回答 1 投票 0

我无法用C++实现简单的内存分配器

我正在尝试实现一个简单的分配器来使用向量,但我不明白为什么它不起作用,我找不到如何做得更好的信息,请告诉我! 输出显示“

回答 1 投票 0

如何通过属性选择定位器?

当产品没有库存时,我有以下属性: 当产品没有库存时,我有以下属性: <div class="sizeButton__container js-quickAddToCartSize -default-classic js-outOfStockSize -outOfStock " title="" data-productid="654354128" data-variantid="654354128002" data-available="null" data-allocation="0" > </div> 当我的产品有库存时,我就有了属性 <div class="sizeButton__container js-quickAddToCartSize -default-classic " title="" data-productid="654354128" data-variantid="654354128003" data-available="true" data-allocation="91"> 所以,我搜索,但我没有找到剧作家如何点击具有属性的定位器:data-available = true'或data-allocation!= 0 那么你能帮我吗? 我尝试 import { defineConfig } from '@playwright/test'; export default defineConfig({ use: { testIdAttribute: 'data-available' } }); 并使用 data-available('true') 调用定位器,但它不起作用 为此,您应该使用 or() 方法。这将根据其中之一创建定位器。以下是一些阅读内容:https://playwright.dev/docs/api/class-locator#locator-or 就您而言,您的定位器可能类似于: const product = this.page .locator("[data-available='null']") .or(this.page.locator("[data-available='true']")); 然后,要使用上面的其中一种,就可以等待了。一些效果: await expect(product.first()).toBeVisible(); 或点击: await product.first().click(); 注意 first() 方法的使用,如果您愿意,可以将其替换为 nth(0),不过我建议使用 first()。 希望这有帮助! :)

回答 1 投票 0

如果在 std::uninitialized_default_construct 之后需要 std::launder

我有一个类似于以下的代码,它使用分配器来分配原始内存,然后使用 std::uninitialized_default_construct_n (或同族的另一个函数)来构造 obj...

回答 1 投票 0

为什么我不能“销毁”“自有”的CRTP向量,但仍然可以释放其地址?

摘自 Björn Fahller 在 2023 年 CPP 会议上的闪电演讲。 => youtu.be/LKKmPAQFNgE 这是关于如何在不接触 new 甚至 malloc 的情况下强制 c++ 泄漏内存。 结构 V:向量 摘自 Björn Fahller 在 2023 年 CPP 会议上的闪电演讲。=> youtu.be/LKKmPAQFNgE 这是关于如何在不接触 new 甚至 malloc 的情况下强制 C++ 泄漏内存。 struct V : vector<V> {}; auto v = V{}; v.emplace_back(); v.swap(v.front()); // v representation becomes uint64_t[3]{ 0x0, 0x0, 0x0}, // so the vector allocation gets lost because no refs are left on the scope. 所以我想知道是否可以手动销毁它。 struct V : vector<V> {}; auto v = V{}; v.emplace_back(); v.emplace_back(); v.emplace_back(); v.emplace_back(); auto front = v.front(); v.swap(v.front()); using allocator = std::allocator<V>; using atraits = std::allocator_traits<allocator>; auto a = front.get_allocator(); atraits::destroy(a, &front + 1); // Ok atraits::destroy(a, &front + 2); // Ok atraits::destroy(a, &front + 3); // Ok // atraits::destroy(a, &front); // error SIGSEGV atraits::deallocate(a, &front, 4); // still seems Ok? 当尝试销毁拥有自己地址的 V 对象时,会发生SIGSEGV。 0x1796320 : 0x1796320 (alloc_begin_ptr) // It owns itself!!! 0x1796328 : 0x1796380 (one_pass_content_end_ptr) 0x1796330 : 0x1796380 (one_pass_alloc_end_ptr) 0x1796338 : 0x0 (alloc_begin_ptr) 0x1796340 : 0x0 (one_pass_content_end_ptr) 0x1796348 : 0x0 (one_pass_alloc_end_ptr) 0x1796350 : 0x0 (alloc_begin_ptr) 0x1796358 : 0x0 (one_pass_content_end_ptr) 0x1796360 : 0x0 (one_pass_alloc_end_ptr) 0x1796368 : 0x0 (alloc_begin_ptr) 0x1796370 : 0x0 (one_pass_content_end_ptr) 0x1796378 : 0x0 (one_pass_alloc_end_ptr) 所以我尝试将其移至堆栈。看起来效果不错。 struct V : vector<V> {}; auto v = V{}; v.emplace_back(); v.emplace_back(); v.emplace_back(); v.emplace_back(); auto front = v.front(); v.swap(v.front()); auto v2 = std::move(front); 没有任何对象拥有自己。 0x7ffc44d02b20 : 0x927320 (alloc_begin_ptr) // v2 on stack 0x7ffc44d02b28 : 0x927380 (one_pass_content_end_ptr) 0x7ffc44d02b30 : 0x927380 (one_pass_alloc_end_ptr) 0x927320 : 0x0 (alloc_begin_ptr) 0x927328 : 0x0 (one_pass_content_end_ptr) 0x927330 : 0x0 (one_pass_alloc_end_ptr) 0x927338 : 0x0 (alloc_begin_ptr) 0x927340 : 0x0 (one_pass_content_end_ptr) 0x927348 : 0x0 (one_pass_alloc_end_ptr) 0x927350 : 0x0 (alloc_begin_ptr) 0x927358 : 0x0 (one_pass_content_end_ptr) 0x927360 : 0x0 (one_pass_alloc_end_ptr) 0x927368 : 0x0 (alloc_begin_ptr) 0x927370 : 0x0 (one_pass_content_end_ptr) 0x927378 : 0x0 (one_pass_alloc_end_ptr) 为什么拥有自身的 allocator_traits::destroy() 上的 vector 会触发 SIGSEGV ? // atraits::destroy(a, &front); // error SIGSEGV 0x1796320 : 0x1796320 (alloc_begin_ptr) // It owns itself!!! 0x1796328 : 0x1796380 (one_pass_content_end_ptr) 0x1796330 : 0x1796380 (one_pass_alloc_end_ptr) [直播] (我假设这一行: auto front = v.front(); 是一个拼写错误,因为 v.front() 是您从中复制的默认构造的 V 对象。这意味着该线本质上是auto front = V{}。你的意思是auto& front = v.front()) &front + 1、&front + 2和&front + 3是指向空向量的指针,这些可以被销毁。 如果您试图破坏 &front 指向的内容,则这是具有 4 个元素的向量。最后三个元素是那些空向量,被销毁是没有问题的。 但 front 的第一个元素是 front 本身。这是未定义的行为,因为您将在已经被销毁的对象上调用析构函数,但实际上它会导致无限循环,因为它只会再次调用析构函数并递归地尝试销毁相同的向量(以及堆栈溢出,从而导致段错误)。 如果您只是释放它,则不会调用析构函数,因此不会出现无限循环。如果向量保存了分配内存的其他向量,则可能会泄漏内存,因为这些向量的析构函数也不会被调用。 正如您所尝试的那样,“修复”此问题的方法是打破“所有权”循环,例如将其移动到新向量(V{} = std::move(front) / V{}.swap(front))。

回答 1 投票 0

如果C++17及以上版本保证分配器必须支持过度对齐类型,这是否意味着我们可以避免创建手动对齐类型?

给定一个自定义向量并使用std::allocator进行分配,在C++17及以上版本下,我们仍然需要使用alignas创建一个内部过度对齐类型OT,然后为OT分配,并reinterpret_...

回答 1 投票 0

在对象的构造函数中打开Boost Interprocess段

我在一个进程的 Boost Interprocess Managed_shared_memory 中创建一个映射>,然后想在另一个进程中打开它以不断写入它。 其他过程...

回答 1 投票 0

如何在 Zig 的 Comptime 中指定分配器?

在 Zig 中,我想在编译时指定一个分配器,以消除将分配器传递给每个需要它的函数所带来的额外开销。在下面的 MWE 中,我有一个类型生成器...

回答 1 投票 0

如果我重载全局new运算符使用内存池来分配内存,这个重载的'new'会影响STL内存分配吗?

目前我公司的一个项目,全局new/delete超载。 我测试了一些短代码,并重载了全局运算符 new。当我使用 STL 时,我看到重载的 new 被调用(比如 v...

回答 1 投票 0

寻找 Dobb 博士 2003/04/01 文章中提供的完整 SharedAllocator 源代码

我需要在多个进程之间共享STL::map而不使用Boost库(我只是不喜欢使用它)。然后互联网搜索让我发现: http://www.drdobbs.com/creating-stl-containers-in-s...

回答 2 投票 0

在使用不同分配器的两个 std::vector 之间移动元素

我有一个 std::vector 类型的对象。在某些时候,我需要将其注入到仅接受 std::vector 的第三方库中<

回答 1 投票 0

为什么propagate_on_container_move_assignment不适用于容器的复制构造函数

我已经阅读了一些关于propagate_on_container_move_assignment的旧帖子,以了解它是如何工作的,但仍然无法理解一些细节。根据我的理解,移动

回答 1 投票 0

分配器的分配和构造是通过[basic.life]p8明确定义的吗?

cppreference 的 std::allocator 示例包含以下代码(为简单起见缩短): // 整数的默认分配器 std::分配器 alloc1; 使用 Traits_t1 = std::allocator_traits<

回答 1 投票 0

std::unordered_map 的自定义分配器

我正在尝试将我的自定义分配器用于 std::unordered_map。分配器已经适用于我自己的对象以及 std::vector,但是当我尝试以相同的方式将它用于 std::unorder 时...

回答 1 投票 0

反弹分配器是否具有相同的size_type和difference_type?

在阅读了一篇关于花哨指针的非常深入的文章之后,其中还描述了它们与分配器的相关性,我有一个疑问。论文涵盖了花哨指针的几个方面,但没有

回答 2 投票 0

monotonic_buffer_resource 和异常处理

monotonic_buffer_resource 的工作原理有点像堆栈,只支持入栈而不支持出栈。不幸的是,我看不出如何在捕获异常时恢复到之前的状态。 即使在交接时

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.