问题标签 [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 投票
2 回答
299 浏览

c++ - 在历史代码中不寻常地使用 new。这是什么意思?

我只是在移植一些旧代码:

看起来原来应该定义自己的神奇new运算符。我很好奇这种用法。

示例用法

当我g++ -E用来获取预处理器输出时,它是:

这看起来有点像placement new.

但是现在这是一个重载的新调用(带有一些时髦的参数,一个五个参数的new调用),还是这里的逗号是逗号运算符,因此它被简化为("Help")(这没有意义)。

new历史上(甚至现在)是否允许有两个以上的参数(size, hint)

任何有关解码的帮助将不胜感激。

0 投票
1 回答
567 浏览

c++ - 关于如何在基于动态数组的结构中存储键值对的想法

我有一个具有以下属性的动态数组:

  1. 存储键值对结构。
  2. 每当添加条目时重新分配内存 (realloc)。调用构造函数。
  3. 删除很棘手 - 被删除的条目必须从它所在的任何位置移动到数组的末尾 - 它的内容(键和值)必须与数组中的当前最后一项交换。调用析构函数。重新分配内存,以便删除该条目。

现在的问题是我最初通过引用将值存储在条目中。但是,那时我不能使用operator=。但我也不能按价值存储。而且我不想存储指针,因为这会破坏整个目的。我目前看到的唯一选择是在被删除的条目上调用placement new,并从最后一个元素调用复制构造函数。这将让我通过引用保留价值。有什么建议吗?还是我应该注意的陷阱?

0 投票
2 回答
2379 浏览

c++ - 在 C++ 中放置新的 VS 显式构造函数调用

最近我遇到了这两种在内存中特定位置创建对象的方法:
1。


2.

第二种方式有点短……还有其他区别吗?问候马特乌斯

0 投票
2 回答
3252 浏览

c++ - STL Containers 分配放置新

我找不到这个问题的确切答案,因此在这里发布。当我想到向量时,它需要在连续的内存位置构建对象。这意味着向量保持分配的内存,并且必须对被推入其中的对象进行就地构造(=放置新)。这是一个有效的假设吗?另外,这是否意味着容器正在手动调用析构函数而不是调用删除?我在这里缺少任何其他假设吗?这是否意味着我可以假设如果我选择编写,即使是为对象编写的自定义 new 也可能不会被调用?

同样,列表使用 new 和 delete 也是有意义的,因为我们不需要连续内存保证。那么,这种行为是驱动分配器行为的原因吗?请帮忙。谢谢

0 投票
3 回答
259 浏览

c++ - 放置新的奇怪行为

不要问我要做什么,这只是一个快速测试,它的唯一目的是查看放置新位置是否有问题。

我发现了一个问题,或者我只是误解了一些东西。

当您删除“#define WORKS”时,它会给您带来访问冲突,例如

效果很好,不同于

这是在销毁阶段引发异常的原因。这里发生了什么?我正在使用 Windows XP 并使用 VC++ Express 2010 进行构建。

0 投票
2 回答
1570 浏览

c++ - 在 Vector Container 中使用placement new

如果我有一个容器:

我可以使用placement new 来分配我的对象,以便所有对象都连续分配吗?这样我就可以做这样的事情:

someRandomeElement随机元素来自哪里elements,然后elementIndex将存储正确的索引,someRandomElement以便elements[elementIndex] == someRandomElement

这是我当前实现内存管理器所必需的。我有一个我今天能够完成的实现,但它要求元素(可以是体素、三角形或其他任何东西)具有 GetIndex() 和 SetIndex() 函数,以便当元素作为指针返回时,我可以找到elements数组中元素的索引,这意味着我无法更改的任何元素(比如说 Ogre::Vector3)都无法使用管理器(在我的情况下,我需要它们使用它,因为它们正在碎片化记忆)。

我唯一的其他解决方案是拥有一个充当访问器并具有索引以及指向元素的指针的结构,尽管这会导致内存使用量增加(考虑到我现在正在处理 500 万个元素)。

注意:我今天发布了一个类似的问题,但那里的答案做出了一些完全违背我的要求的假设。其中一项要求是向量必须填充指向T否则大部分代码库需要更改的指针。其次,初始化超过 100,000 个(大约)元素会导致 bad_alloc 异常。每个元素的大小为 196 字节(我已设法将其减少到 132 字节)。

0 投票
2 回答
357 浏览

c++ - 使用新位置转移对象所有权

我有一个 Visual Studio 2008 C++ 项目,其中有一个类管理无法复制的资源。我已经实现了按引用结构传输的语义(ala std::auto_ptr)。

不幸的是,当我将此模式与使用placement-new 的库一起使用时,我得到一个编译器错误:

例如:

我怎样才能修改Test它以便它可以与放置 new 一起使用并且仍然保留它的所有权语义?

谢谢,保罗

0 投票
2 回答
611 浏览

c++ - `new (this) MyClass();` 是直接调用析构函数后未定义的行为吗?

我的这个问题中,@DeadMG 说通过this指针重新初始化一个类是未定义的行为。在某处的标准中是否有提及?

例子:

Ideone 的示例输出(我知道 UB 也可以是“看似正确的行为”)。
请注意,我没有在类之外调用析构函数,以不访问生命周期已结束的对象。另请注意,@DeadMG 表示直接调用析构函数是可以的,只要它为每个构造函数调用一次。

0 投票
5 回答
517 浏览

c++ - 将运算符 new[] 和放置 new 与普通 delete[] 混合

只是出于好奇,以下合法吗?

相似地:

0 投票
4 回答
6100 浏览

c++ - 如何删除通过放置新运算符构造的对象?

那么什么是正确的破坏方式t呢?

PS 上面的代码只是为了描述我的问题,和我要写的代码没有真正的关系。所以请不要给出类似的答案(为什么使用安置new而不是非安置?或类似的东西)