问题标签 [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.
c++ - 删除这个并放置新的虚拟派生类
这是我的代码的简短、独立、正确(可编译)的示例(基本上是any_iterator
为了我自己的成长而重新发明)。
问题归结为:当共享基础上没有任何其他成员时,使用从同一基础虚拟派生的不同类型进行销毁this
和重建是否是未定义的行为?具体来说,是否允许this
编译器调用静态类型的跟踪,或者这在技术上是不符合标准的?
[编辑] 一些人指出,如果derivedA
在堆栈上创建,编译器可能会调用不正确的析构函数。(1) 我在标准中找不到任何允许编译器这样做的东西。(2) 这与我的问题的意图不同,所以我更改了代码以显示derived
不能放在堆栈上。 base
虽然仍然可以在堆栈上。
c++ - 使用placement new[]有什么问题?做
考虑下面的程序。它已经从一个复杂的案例中简化了。除非我删除 Obj 类中的虚拟析构函数,否则它无法删除先前分配的内存。我不明白为什么程序输出的两个地址不同,只有在虚拟析构函数存在的情况下。
当虚拟析构函数存在时,这是我的实现中程序的输出:
分配的内存地址开始于:0x8895008 要释放的内存开始于:0x889500c
运行失败(退出值 1)
请不要问它应该做什么程序。正如我所说,它来自一个更复杂的案例,其中 Arena 是各种类型内存的接口。在这个例子中,内存只是从堆中分配和释放。
c++ - 调用placement new时,将指针转换为“void *”是否有任何影响?
我正在审查自定义容器的代码,它的某些部分创建了如下元素:
有些人这样做:
因此,两者都使用placement new来调用复制构造函数,通过复制其他元素来创建元素,但在一种情况下,指向新元素存储的指针按原样传递,而在另一种情况下,它被强制转换为void*
.
这个演员阵容void*
有什么影响吗?
c++ - C++ - 重载 operator new 并提供额外的参数
我知道你可以重载 operator new
。当你这样做时,你的方法会size_t
默认发送一个参数。但是,是否可以将size_t
参数以及其他用户提供的参数发送到重载的new
运算符方法?
例如
因为我想像这样覆盖 new 运算符
谢谢
编辑:这是我想要完成的:
我在应用程序启动时分配了一大块虚拟内存(内存池)。继承我的基类的所有对象都将继承其重载的 new 运算符。我有时想在重载的 new 中传递参数的原因是告诉我的内存管理器我是否想使用内存池,或者我想用 malloc 分配它。
c++ - Array placement-new requires unspecified overhead in the buffer?
5.3.4 [expr.new]
of the C++11 Feb draft gives the example:
new(2,f) T[5]
results in a call ofoperator new[](sizeof(T)*5+y,2,f)
.Here, x and y are non-negative unspecified values representing array allocation overhead; the result of the new-expression will be offset by this amount from the value returned by
operator new[]
. This overhead may be applied in all array new-expressions, including those referencing the library functionoperator new[](std::size_t, void*)
and other placement allocation functions. The amount of overhead may vary from one invocation of new to another. —end example ]
Now take the following example code:
#xA;According to the above quote, the second line new (buffer) std::string[10]
will internally call operator new[](sizeof(std::string) * 10 + y, buffer)
(before constructing the individual std::string
objects). The problem is that if y > 0
, the pre-allocated buffer will be too small!
So how do I know how much memory to pre-allocate when using array placement-new?
#xA;Or does the standard somewhere guarantee that y == 0
in this case? Again, the quote says:
This overhead may be applied in all array new-expressions, including those referencing the library function
operator new[](std::size_t, void*)
and other placement allocation functions.
c++ - 销毁然后使用相同的变量构造新对象
有时重新开始是件好事。在 C++ 中,我可以采用以下简单的操作:
在作用域结束时,析构函数将再次运行,一切看起来都很好。(我们也可以说T
有点特殊,不喜欢被分配,更不用说交换了。)但有件事告诉我,破坏一切并重试并非总是没有风险。这种方法有可能会遇到问题吗?
c++ - 编译器如何知道必须调用第二个析构函数,对于在同一地址构造两次的对象?
在下面的代码中,sub
类中的对象C
被构造了两次。第一个构造调用默认 ctor Sub()
,第二个构造用于placement new
在同一地址重建此对象。
因此析构函数也被调用了两次。第一次调用使用对Sub
dtor in的直接调用~C()
,第二次调用是main()
在atexit()
函数结束后调用的。
鉴于对象sub
是在同一地址重构的,编译器如何知道必须在之后调用第二个析构函数main()
?他将这些信息保存在哪里?
c++ - 如何正确释放placement new分配的内存?
我一直在阅读,当您使用placement new时,您必须手动调用析构函数。
考虑以下代码:
据我所知,操作员delete
通常会调用析构函数,然后释放内存,对吗?那么我们为什么不使用delete
呢?
nullptr
在第一种情况下,我们在调用析构函数后被迫将 pMyClass 设置为:
但是析构函数没有释放内存,对吧? 那么这会是内存泄漏吗?
我很困惑,你能解释一下吗?
c++ - malloc 和放置新与新
过去几天我一直在研究这个问题,到目前为止,除了教条式的论点或对传统的诉求(即“这是 C++ 方式!”)之外,我还没有真正找到任何令人信服的东西。
如果我正在创建一个对象数组,那么使用的令人信服的原因(除了易用性之外)是什么:
超过
据我所知,后者比前者效率更高(因为您不会将内存初始化为一些非随机值/不必要地调用默认构造函数),唯一的区别是您清理的事实:
和你清理的另一个:
我出于一个令人信服的理由离开了。呼吁它是 C++(不是 C),因此不应该被使用这一事实malloc
——free
据我所知——并不像教条一样引人注目。有什么我想念的东西优于吗?new []
malloc
我的意思是,尽我所能告诉你,你甚至不能使用new []
- 根本 - 来制作一个没有默认无参数构造函数的数组,而malloc
可以使用该方法。
c++ - 为什么这段代码试图调用复制构造函数?
我只是在 Visual Studio 中花费了大量时间来处理编译错误。我已将代码提炼成下面的可编译的小示例,并在 IdeOne 上进行了尝试,并得到了您可以在此处看到的相同错误。
我想知道为什么以下代码尝试调用B(const B&)
而不是B(B&&)
:
我没有明确定义任何构造函数,所以B(std::move(binst))
应该调用编译器生成B(B&&)
,不是吗?
当我更改B
为
它编译得很好。为什么是这样?
如果这不能从基类中修复,那将非常不方便,因为我有一个模板类,它使用像示例这样的放置 new 和移动构造函数,并且它将需要每个不可复制的类(这不是而且绝对应该不是与我的模板类一起使用的要求)具有明确定义的移动构造函数。