问题标签 [placement-new]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
25 回答
195160 浏览

c++ - “安置新”有什么用?

这里有人用过 C++ 的“placement new”吗?如果有,是为了什么?在我看来,它只对内存映射硬件有用。

0 投票
4 回答
9244 浏览

c++ - CUDA:在 C++ 中包装设备内存分配

我现在开始使用 CUDA,不得不承认我对 C API 有点失望。我理解选择 C ​​的原因,但是如果该语言是基于 C++ 的,那么有几个方面会简单得多,例如设备内存分配(通过cudaMalloc)。

我的计划是自己做这件事,使用operator new放置new和 RAII 重载(两种选择)。我想知道到目前为止是否有任何我没有注意到的警告。该代码似乎有效,但我仍然想知道潜在的内存泄漏。

RAII代码的用法如下:

在这种情况下,一个类可能是矫枉过正(特别是因为你仍然必须使用cudaMemcpy,类只封装 RAII)所以另一种方法是放置new

在这里,cudaDevice仅仅作为一个标签来触发过载。然而,由于在正常放置中new这将指示放置,我发现语法奇怪地一致,甚至可能比使用类更可取。

我会很感激各种批评。是否有人可能知道下一个版本的 CUDA 是否计划在这个方向上做一些事情(正如我所听说的,这将改进其对 C++ 的支持,无论他们的意思是什么)。

所以,我的问题实际上是三个方面:

  1. 我的展示位置new重载在语义上是否正确?它会泄漏内存吗?
  2. 有没有人知道未来 CUDA 发展朝着这个大方向发展的信息(让我们面对现实:C++ s*ck 中的 C 接口)?
  3. 我怎样才能以一致的方式更进一步(还有其他 API 需要考虑,例如不仅有设备内存,还有常量内存存储和纹理内存)?

关于这里使用的单身人士:是的,我知道它的缺点。但是,这些在这种情况下无关紧要。我在这里只需要一个不可复制的小型标签。其他一切(即多线程注意事项、初始化时间)都不适用。

0 投票
12 回答
6001 浏览

c++ - C++ 构造“placement new”的用途是什么?

我刚刚了解了名为“placement new”的 C++ 构造。它允许您精确控制指针在内存中指向的位置。它看起来像这样:

(来自C++ FAQ Lite的示例)

在此示例中,thisFred 的指针将等于place


我已经看到它在我们团队的代码中使用过一两次。根据您的经验,这种结构能带来什么?其他指针语言有类似的结构吗?对我来说,这似乎让人想起equivalenceFORTRAN,它允许不同的变量占据内存中的相同位置。

0 投票
3 回答
2463 浏览

c++ - 可变大小的类 - C++

我见过一个类是这样定义的类..

静态工厂函数有以下实现..

据我了解,这个函数使用placement new 来扩展这个类。

这是否只是因为只有 1 个成员并且它是在堆上分配的?

0 投票
2 回答
331 浏览

c++ - 如何使用模板中的放置删除/新建来重置课程?

我有一个池管理器模板类。当一个类对象被添加回池管理器时,我想将它重置回它的初始状态。我想在它上面调用放置析构函数和放置构造函数,以便在下次池管理器发出它时完全重置它。我已经尝试了很多方法来让它工作,但我很难过。这是我尝试过的一个例子。

我尝试了一堆不同的语法,但似乎都没有。代码本身是跨平台的,所以应该使用 gcc(在 mingw 或 linux 或 mac 下)编译,对于 Windows,我仍在使用 vs 2003。

0 投票
1 回答
1472 浏览

c++ - POD class initialized with placement new default initialized?

If I initialize a POD class with placement new, can I assume that the memory will be default initialized (to zeros)? This resource clearly states that if you call the zero argument default constructor explicitly that the fields will be default initialized, but it is not clear if this would hold true using the default implementation of placement new (passing an address). Is it standard behavior for the memory to be zeroed in this case?

0 投票
5 回答
615 浏览

c++ - 这些放置新宏是否正确?

我制作了几个宏来使使用placement new 更容易一些。我只是想知道是否有任何明显的情况下这些不起作用。谢谢。

0 投票
11 回答
543 浏览

c++ - 如何在内存中连续分配可变大小的结构?

我正在使用 C++,我有以下结构:

在内存中,我希望在每个 DataPoint 的末尾有 1 个或多个 ArrayOfThese 元素。每个 DataPoint 的 ArrayOfThese 元素的数量并不总是相同。

因为我有大量的数据点要组装然后通过网络流式传输,所以我希望我的所有数据点及其 ArrayOfThese 元素是连续的。为固定数量的 ArrayOfThese 元素浪费空间是不可接受的。

在 C 语言中,我会在 DataPoint 的末尾创建一个元素,声明为ArrayOfThese d[0];,分配一个 DataPoint 加上足够的额外字节用于我拥有的许多 ArrayOfThese 元素,并使用虚拟数组对它们进行索引。(当然,ArrayOfThese 元素的数量必须在 DataPoint 的字段中。)

在 C++ 中,使用放置新的和相同的 0 长度数组是正确的方法吗?如果是这样,placement new 是否保证从同一个内存池对 new 的后续调用将连续分配?

0 投票
2 回答
725 浏览

c++ - 新的放置魔术?

我正在“手动”玩动态内存分配,我想看看 MS 的人如何实现新的放置,但是在调试时我“步入”它让我开始编写代码:

当我在这段代码中看到的所有内容都与我作为参数提供的返回语句一致时,谁能向我解释这段代码到底是如何将我的对象放置在指针所指向的位置的。我不认为在评论中说我希望这个 fnc 做什么实际上足以让它工作。感谢您提供任何建设性的答案。

0 投票
7 回答
1462 浏览

c++ - 从 void 指针缓冲区进行结构实例化

这是一些对我来说看起来很有趣的 C++ 代码,但我知道它有效。

定义了一个结构,在程序中我们使用 void 指针分配内存。然后使用分配的缓冲区创建结构。

这是一些代码

代码有更多的东西,但这就是它的要点。

我没有测试过这段代码,但我正在查看的代码已经过很好的测试,并且可以正常工作。但是怎么做?

谢谢。

编辑:修复了内存泄漏。