问题标签 [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 回答
538 浏览

c++ - 模板化函数和放置新的构造函数参数

我在内存管理器类中声明了几个模板化方法:

这个想法是,这些方法将为给定的任何类分配内存并调用构造函数。

问题是如果你想提供构造函数参数..我唯一的解决方案是在上面为每个变体重载函数。我觉得它不是很可行。

有没有更好的解决方案?

0 投票
2 回答
735 浏览

c++ - 如何在可能使用placement new的同时创建一个数组

我一直致力于创建自定义分配器作为一种有趣的练习/练习,并且在创建数组时遇到了两个潜在问题。对于典型的分配调用,我将使用mallocand placement new。但是,当我去创建一个数组时,我对应该如何完成感到困惑。这一次,我注意到在某些地方,数组似乎placement new可能不安全,例如hereplacement new在尝试用于数组时,我也遇到了自己的错误。我会得到错误

`error C2679: binary '=' : no operator found 它采用'SomeClass *' 类型的右侧操作数(或没有可接受的转换)

我理解错误(我相信),但我更希望通过我的数组构造方法解决错误。我有两个问题

1)分配器如何在不使用的情况下创建数组new[]?是placement new吗?如果是这样,我上面发布的链接中提到的潜在危险呢?

2)如果我想placement new在数组中的每个元素上使用和调用它,为什么会出现上述错误?

0 投票
6 回答
1139 浏览

c++ - 放置新零是否会耗尽内存?

我有以下代码:

表达式是否使new(d) foo(*d)指向的对象d保持不变?更具体地说,如果类foo和其中递归包含的所有对象仅具有微不足道的复制构造函数,那么上述情况是否正确,那么是否new(d) foo(*d)保持*d不变?不正确的情况可能是,new在调用复制构造函数之前首先将内存清零。C++语言中有这样的子句吗?

编辑:有人想要这样做有重要的原因。考虑跨地址空间复制对象,例如,从 CPU 内存到 GPU 内存。一种解决方案是逐字节地处理对象。这在很多情况下都有效。如果该类具有虚方法,则逐字节复制复制 vtable 指针,该指针随后将指向一些 CPU 内存。可以在对象上使用上述表达式new(d) foo(*d)来强制编译器重置 vtable 指针。

0 投票
4 回答
2075 浏览

c++ - 我们是否需要为分配有“新位置”的“简单 POD 类”显式调用析构函数?

这里的“简单”是指具有非虚拟空析构函数或 POD 类型的类。

典型例子:

如果我们不调用显式析构函数 on 会发生什么p?我不认为这是未定义的行为或内存泄漏。
重复使用有什么问题buffer吗?

0 投票
5 回答
289 浏览

c++ - 放置新行为等效

我有一个关于安置的问题new我对C++ 中以下两个代码片段在功能上是否等效并且可以互换使用(我并不是暗示应该使用第二个,当第一个适合时)?

#1

#2

当我使用像这样的放置新语法时,有什么我应该特别注意的吗?

0 投票
2 回答
725 浏览

c++ - 用作对象的封装字符数组是否违反了严格的别名规则

下面的类是否打破了严格的别名规则:

我对标准的解读是它是不正确的,但我不确定(我的用法是拥有一个对象数组T+这些对象的一些元数据,但是可以在不手动分配内存的情况下控制对象构造/解构)作为分配的对象被用作new标准中放置的示例。

0 投票
4 回答
89 浏览

c++ - 将数据成员的生命周期限制为一种方法

我遇到了一个稍微不寻常的问题。考虑以下代码:

parse 方法用一个方法初始化词法分析器init。在此之前,词法分析器处于不可用的“默认”状态。通常,在构造过程中应该初始化一个成员,所以我为什么不简单地这样做:

首先,这意味着客户端可以多次调用 parse 方法,这没有多大意义。

其次,更重要的是,它很容易导致严重的生命周期问题:

在上面的代码中,词法分析器将使用一个在行尾不再存在的临时字符串对象进行初始化,因此parse在下一行调用该方法将调用未定义的行为。

由于这两个原因,我真的很想用相同的方法进行初始化和解析。不幸的是,我不能在构造函数中这样做,因为我需要返回一个结果,而构造函数不能返回结果。

从技术上讲,如果我也相应地更改构造函数和析构函数,则可以在方法内部构造词法分析器parse并在之后将其销毁:

但这是迄今为止我在很长一段时间内编写的最丑陋的代码。它也不是异常安全的;如果辅助方法抛出怎么办?事实上,这正是遇到解析错误时发生的情况。

那么我应该如何解决这个问题呢?在内部使用本地词法分析器parse并有一个lexer*成员指向它?使用boost::optional<lexer>会员?还是我应该只接受这种init方法?还是我应该在构造函数中进行解析并抛出一个包含所需结果的“期望”?

0 投票
7 回答
9310 浏览

c++ - 使用 const 成员分配类

考虑以下代码:

我收到“const int id”无法使用默认赋值运算符的编译器错误。

Q1。为什么 push_back() 需要赋值运算符?
A1。因为当前的 c++ 标准是这样说的。

Q2。我该怎么办?

  • 我不想放弃 const 说明符
  • 我想复制数据

A2。我将使用智能指针。

Q3。我想出了一个“解决方案”,这似乎很疯狂:

我应该避免这种情况,为什么(如果是)?如果对象在堆栈上,使用新放置是否安全?

0 投票
2 回答
1916 浏览

c++ - Reinterpret_cast 与安置新

通过阅读这篇文章,很明显 C++ 中的放置消息用于在预分配的内存位置调用类构造函数。

在内存已经初始化的情况下,placement new 还是 reinterpret_cast 更合适?

例如,假设我从 TCP 套接字读取表示帧消息的原始字节流。我将此流放入帧同步并检索一个已知大小的缓冲区,该缓冲区代表我的类,我将其称为 Message。我知道有两种方法可以继续。

  1. 创建一个带有标志的构造函数,告诉类不要初始化。在传递“不初始化”标志的缓冲区上做一个新的放置。

    /li>
  2. 使用 reinterpret_cast

    /li>

我相信这两者都会产生相同的结果。一个比另一个更正确、更面向对象、更安全、更易于阅读还是更好的风格?

0 投票
1 回答
189 浏览

c++ - 以前初始化内存是否保证在放置新调用后持续存在?

说我有以下内容:

即使aSecond没有进行值初始化,第二个断言是否也能保证成立?从逻辑上讲,它应该,因为内存没有被覆盖,但它是由标准指定的吗?