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

c++ - 运算符重载(尤其是“新”)arity 是如何工作的?

我从来没有完全理解运算符重载的参数列表是如何以系统的方式确定的,而且我对我现在遇到的一个问题感到特别困惑。

当您重载一元运算符时,它有一个参数,如果它是类成员则为零。当您重载二元运算符时,它有两个参数,或者如果它是类成员则有一个。至少它看起来是这样工作的。但是,我遇到了operator new(不是班级成员)的问题。

在我正在工作的代码库中,就像我过去看到的其他地方一样(例如这里),有一个定义类似#define new new(__FILE__, __LINE__)和一个相应的函数,带有签名void *new(size_t size, const char *file, unsigned line)或类似的东西,用于内存调试。我注意到我项目中的那个实际上与之前链接的那个不同。这对我来说是个问题,因为出于某种原因它搞砸了新的展示位置。我查看了The C++ Programming Language,如果它解释了这一点,我就错过了。

在这方面有什么new特别之处,即它是否具有特定语言定义的额外调试签名?看起来不像是因为,正如我上面提到的,我在不同的地方看到了稍微不同的签名。如果有,还有哪些其他运营商有非显而易见的签名,它们是什么?这些不同的签名是不是一些特定于实现的附加功能?如果是这样,是否有关于大多数实现的一般规则?或者,这是否像我在标题中暗示的那样是一个问题?您可以在签名中添加任意数量的额外参数吗?如果您使用new关键字本身和您想要的新类型之间的参数调用 new,您可以做任何事情?还是我更加困惑,我还缺少其他东西?

最重要的是在短期内(虽然我真的很想了解这一点),我的位置发生了什么混乱new?宏正在引起类似的扩展new ("file.cpp", 100) (class_pointer) class_t。可能是括号中的两组问题,还是其他问题?

0 投票
9 回答
33935 浏览

c++ - C ++,是否可以直接调用构造函数,而不需要new?

new如果我已经有对象的内存,我可以在不使用的情况下显式调用构造函数吗?

0 投票
7 回答
11360 浏览

c++ - 使用 new(this) 重用构造函数

这是最近在我担任助教的一堂课上出现的。我们正在教学生如何在 C++ 中进行复制构造函数,而最初教 Java 的学生问你是否可以从另一个构造函数中调用一个构造函数。我知道答案是否定的,因为他们在课堂上的代码中使用了迂腐标志,而旧标准不支持这一点。我在 Stackoverflow 和其他网站上发现了一个使用new (this)以下方法伪造这个的建议

这是非常简单的代码,显然没有通过重用构造函数来节省任何代码,但这只是示例。

我的问题是,这是否符合标准,是否有任何边缘情况需要考虑以防止其成为合理的代码?

编辑:我应该注意,这对我来说似乎很危险,但这更多的是从我不真正了解它的角度来看,而不是知道它会如何变坏。我只是想确保如果学生问到它,我可以指导他们为什么可以或不应该这样做。出于所有实际目的,我已经向他们建议使用共享初始化方法。这更像是一个教学问题,而不是一个实际项目。

0 投票
4 回答
3432 浏览

c++ - 没有默认构造函数的类数组的新运算符

对于没有默认构造函数的类,可以使用 operator new 和placement new 来声明该类的数组。

当我阅读更有效的 C++ 中的代码时,我发现代码如下(我修改了一些部分).....

我的问题是,为什么需要运算符 new 之后的 [] ?

我在没有它的情况下测试它,它仍然有效。任何机构都可以解释吗?

0 投票
7 回答
1073 浏览

c++ - 放置 new 以推迟到不同的构造函数

这安全吗?我在实际实现中没有使用任何虚函数,但我很想相信即使我使用了,它仍然是安全的。

0 投票
4 回答
2483 浏览

c++ - 安全放置新的和显式的析构函数调用

这是我的代码示例:

我的问题是,这是一种安全的方法吗?我是否在某些情况下犯了一些隐藏的错误?它适用于每种类型的对象(PO​​D 和非 POD)吗?

0 投票
6 回答
40878 浏览

c++ - 什么是 C++ 中的就地构造函数?

可能的重复:
C++ 的“新位置”

什么是 C++ 中的就地构造函数?

例如Datatype *x = new(y) Datatype();

0 投票
1 回答
170 浏览

c++ - C++ 中的段错误在预分配缓冲区中创建的对象上调用虚拟方法

嗯......标题有点拗口,但我真的不确定这是哪一部分导致问题,我已经经历了很多次,并且无法确定原因......

这个想法是让单个 Choice 实例能够存储传递给它的模板列表的任何类型的任何一个值......它有点像一个联合,除了它跟踪被存储的类型并考虑值每种类型都是不同的,这允许它绕过联合成员中构造函数的 C++ 约束。

它在某些情况下确实有效,但清理代码似乎存在一些问题。当我开始使用这个结构和参数列表中传递的 std::basic_string 或类似类型时,我开始遇到段错误,但我不明白为什么会导致任何问题。

这对我自己来说是一种虽然实验,但我看不出它不应该工作的任何原因(在 g++ 中以 C++0x 模式编译):

非常感谢,如果有人能找出我做错了什么:)

0 投票
1 回答
8023 浏览

c++ - 放置新的和非默认的构造函数

我可以在带有参数的构造函数上调用 C++ 放置 new 吗?我正在实现一个自定义分配器,并希望避免将功能从非默认构造函数移动到一个 init 函数中。

我希望使用第二个构造函数在 pChunkOfMemory 构造一个 CFoo 类型的对象。使用 operator new 时,我是否只使用默认构造函数?

解决了!我没有#include <new>。在此之后,调用placement ::new 可以很好地使用非默认构造函数。

0 投票
5 回答
479 浏览

c++ - 这第二个是什么新东西?

第二行是什么?(在回答另一个问题时看到。)

在第二行之后 x 和 y 具有相同的值(指向同一个地方)。y = x 和第二行有什么区别?它像构造函数还是什么?