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

c++ - 如何为具有内部放置 new 的类实现安全复制构造函数(使用 std::string)

这是我的代码:

任何有关如何添加正确处理内部分配 std::string 情况的复制构造函数的建议,将不胜感激。

0 投票
5 回答
1137 浏览

c++ - 可以对分配有新位置的指针进行调用删除吗?

我们可以调用与放置delete一起分配的指针吗?如果没有,那为什么?请详细说明。new

我知道没有展示位置删除。但我想知道为什么只是删除操作符不能删除内存而不关心指针指向的内存是如何分配的?

delete正在做两件事:

  1. 调用析构函数
  2. 释放内存

而且我认为删除没有理由不能对放置 new 创建的对象调用这两个操作中的任何一个。关于原因的任何想法?

0 投票
2 回答
2657 浏览

c++ - 我可以在 operator= 中使用放置 new(this) 吗?

背景: 我有一个复杂的类,有很多变量。我有一个健全且经过测试的复制构造函数:

初始化器列表中调用的一些成员变量复制构造函数执行分配。

问题: 我需要创建operator=. 我可以简单地执行以下操作,而不是使用赋值而不是初始化列表来复制现有的构造函数,并释放正在被替换的内存等等等等:

换句话说,destroy self 后跟一个placement new 复制构造函数在语义上与 operator= 相同吗?

这似乎有可能显着减少重复代码并确认每个变量都已正确初始化,但代价是分配期间可能会轻微降低效率。我错过了一些更模糊的东西吗?

理由: 我的实际班级有大约 30 个变量。我担心我的复制构造函数和赋值运算符都必须复制所有 30 个,并且代码可能会出现分歧,导致这两个操作做不同的事情。

0 投票
3 回答
986 浏览

java - 什么是 C++ 中的放置新运算符,java 有吗?

我听说过 C++ 的placement new 运算符。我很困惑它是什么。但是,我可以看到它可以在stackoverflow中的问题下使用。我也很困惑我们是否在java中有这个。所以我的问题非常准确:什么是placement new 运算符,我们在java 中有类似的东西吗?

请注意,不要与 stackoverflow 上的其他问题混淆:它们不是这个问题的重复。

0 投票
4 回答
505 浏览

c++ - 这是删除别名警告UB的技巧吗?

我们刚刚将编译器升级到 gcc 4.6,现在我们收到了一些警告。目前我们的代码库还没有处于使用 c++0x 编译的状态,无论如何,我们不想在 prod 中运行它(至少现在还没有) - 所以我需要修复来删除这个警告。

警告通常是由于以下原因而发生的:

稍后,这是通过以下方式使用的

例如,要读取、更新和返回,曾经发生过以下转换

4.4 没问题;在 4.6 中,上述生成:

警告:类型双关指针会破坏严格的别名规则

现在消除此错误的一种干净方法是使用 a union,但是就像我说的那样,我们不能使用 c++0x (因此不能使用不受限制的联合),所以我使用了下面可怕的 hack - 现在警告已经消失,但是我可能会调用鼻守护程序吗?

这似乎可以正常工作(请参见此处的简单示例:http ://www.ideone.com/9p3MS )并且不会产生任何警告,在 c++0x 之前使用它是否可以(不是在风格上)?

注意:我不想-fno-strict-aliasing一般使用...

编辑:看来我弄错了,4.4 版也有同样的警告,我想我们最近才发现这个变化(它总是不太可能是编译器问题),但问题仍然存在。

编辑:进一步调查产生了一些有趣的信息,似乎在一行中进行强制转换和调用成员函数是导致警告的原因,如果代码分为如下两行

这实际上不会产生警告。结果,我在 ideone 上的简单示例存在缺陷,更重要的是,我上面的 hack 没有修复警告,修复它的唯一方法是将函数调用与强制转换分开 - 然后强制转换可以保留为reinterpret_cast.

0 投票
3 回答
691 浏览

c++ - 在同一个地址多次放置新的位置是否明确/合法?

(注意:这个问题的动机是试图提出预处理器黑客来生成无操作分配来回答另一个问题:

接受新对象的宏

......所以请记住这一点!)

这是一个人为的类:

...我将这样分配:

在我使用的 gcc 上,我得到了“预期”的结果:

哪个很棒,但是编译器/运行时是否可以将其视为滥用而拒绝,并且仍然在规范的右侧?

用线程怎么样?如果我们实际上并不关心这个类的内容(假设它只是一个虚拟对象),它至少不会崩溃,例如在更简单的应用程序中使用 POD int 来驱动它?

0 投票
4 回答
895 浏览

c++ - 放置新的中断常量和引用?

在讨论了这个问题的回答之后,显然:

允许以下代码

但不允许使用以下代码

因为$3.8/7

如果在对象的生命周期结束之后,在对象占用的存储空间被重用或释放之前,在原始对象占用的存储位置创建一个新对象,一个指向原始对象的指针,一个指向原始对象的引用引用原始对象,或者原始对象的名称将自动引用新对象,并且一旦新对象的生命周期开始,可用于操作新对象,如果:

  • 原始对象的类型不是 const 限定的,并且,如果是类类型,则不包含任何类型为 const 限定或引用类型的非静态数据成员...

我可以理解f.x当 f 不再存在时引用如何失效,但我不明白为什么f_ref应该仅仅因为它的成员之一是 const 和/或引用而不是其他原因而失效:它是对 aFoo之前和是对aFoo之后的引用。

有人可以解释这种情况背后的理由吗?

编辑

感谢您的回答。我不购买“保证它不会改变”的论点,因为我们目前不允许优化器缓存引用,例如:

我看不到如何do_it允许使引用的值无效,但operator new不是—— 序列点使缓存的值无效:为什么要免除 delete/placement-new?

0 投票
2 回答
654 浏览

c++ - 使用放置 new、malloc 和 free

基本上,我有一块使用 malloc 分配的内存,我想开始使用placement new 将对象放入其中。我知道在删除这些对象时必须显式调用这些对象的析构函数,但我想确保我完全理解这一点,并且以正确的方式进行。我几乎肯定会放弃这种方法并以更直接的方式处理事情,但我认为我只是为了理解而要求。

我有一个包含以下私有成员变量的类 WordIndex:

使用 malloc/realloc 为两个指针分配/重新分配内存,并使用以下代码创建对象(它们不会覆盖任何预先存在的对象):

我有一个如下的析构函数,但我几乎 100% 确定它没有正确地做事,尽管在运行时没有显示任何错误。

我的问题如下:

  1. 考虑到 Word 结构有一个向量,简单地调用 ~Word 就足够了,还是我需要事先单独调用向量的析构函数?
  2. 我是否需要为字符串(m_lines 和 Word.word)调用析构函数,如果需要,我该怎么做?它似乎没有我可以调用的 ~string 之类的函数。
  3. 我还有什么遗漏吗?我相当肯定我有。

提前致谢!

0 投票
2 回答
482 浏览

c++ - 通过放置 new 延迟真正的基类构造

我在问以下方法是否(以及为什么)是a)合法的和b)道德的。我问的重点是 C++03,但也欢迎对 C++11 进行注释。这个想法是为了防止本身可以默认构造的派生类实现愚蠢的B::B(int foo) : A(foo) {}构造函数。

我的直觉告诉我,这里有些可疑。如果任何Derived类访问Base其构造函数中的成员,我想在其他地方,但否则我很难看到该方法不好的有效原因。

无论如何,如果您认为这是一种可以接受的方法,那么如何处理参考成员(例如int& Base::j)?

注意:这是如何在 C++03 中伪造构造函数继承的后续问题?.


编辑:发布问题时我一定分心了。当然,不是delete b我的意思b->~Base()。我怪低血糖!

0 投票
2 回答
246 浏览

c++ - 从动态创建的数组构造 POD 对象时,是否推荐使用放置新?

给定任何 POD 类型,是否建议执行以下操作: