问题标签 [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++ - 放置新+数组+对齐
当我使用调试器跳过这些行时,它会显示变量 Buffer 和 BufferPtr 的值:
我真的不明白为什么这些价值观不同。按照我的理解,placement new 应该使用从地址“BufferPtr”开始的内存来使用分配内存上的默认构造函数初始化数组元素,并返回指向数组中第一个元素的第一个字节的指针,这应该是与传递给placement new 操作符的字节完全相同。
我是否理解错误或有人可以告诉我为什么这些值不同?
谢谢!
//编辑:好的 - 我进一步调查了这个问题并得到了更令人困惑的结果:
调试器为我的变量返回以下值:
所以它显然必须与我的通用智能指针类 matth_ptr 有关,所以它是:
谁能解释我发生了什么事?谢谢!
c++ - C++ 中的简单存储类和严格的别名
我有以下代码用于存储一个小类。
gcc 4.4 警告我在storage::get()
返回时违反了严格的别名规则。
AFAIK,我没有违反任何规则。我实际上违反了严格的别名还是 gcc 在这里变得很挑剔?
有没有办法在不禁用严格别名的情况下让它免费警告?
谢谢
编辑:
另一方面,以下实现没有给出任何警告:
编辑:
gcc 4.5 及更高版本不会发出警告 - 所以显然这只是对严格别名规则的误解或 gcc 4.4.x 中的错误
c++ - 使用重载放置 new/delete 提升 shared_ptr
我正在将 boost shared_ptr 与我自己的内存管理器一起使用(精简示例,我希望其中没有错误):
我正在这样使用它:
但现在我意识到了。如果 shared_ptr 删除了我的 onject,它会调用 Deleter::operator() 并且对象被删除。但是析构函数没有被调用......
我怎样才能改变这个?
c++ - Placement-new vs gcc 4.4.3 严格别名规则
我有一些多年来一直成功使用的代码来实现“变体类型对象”;也就是说,一个 C++ 对象可以保存各种类型的值,但只使用(大约)与最大可能类型一样多的内存。该代码在精神上类似于标记联合,除了它也支持非 POD 数据类型。它通过使用 char 缓冲区、放置 new/delete 和 reinterpret_cast<> 来完成这个魔术。
我最近尝试在 gcc 4.4.3 下编译这段代码(使用 -O3 和 -Wall),并收到很多这样的警告:
根据我的阅读,这表明 gcc 的新优化器可能会生成“错误”代码,我显然希望避免这种情况。
我在下面粘贴了我的代码的“玩具版”;我可以对我的代码做些什么来使其在 gcc 4.4.3 下更安全,同时仍然支持非 POD 数据类型?我知道作为最后的手段,我总是可以使用 -fno-strict-aliasing 编译代码,但如果代码在优化下不会中断会很好,所以我宁愿不这样做。
(请注意,我想避免在代码库中引入 boost 或 C++0X 依赖项,因此虽然 boost/C++0X 解决方案很有趣,但我更喜欢更老式的东西)
c++ - Legality of using operator delete on a pointer obtained from placement new
I'm dang certain that this code ought to be illegal, as it clearly won't work, but it seems to be allowed by the C++0x FCD.
Maybe one of you language lawyers can explain how the standard forbids this.
There's also an array form:
This is the closest question I was able to find.
EDIT: I'm just not buying the argument that the standard's language restricting arguments to function void ::operator delete(void*)
apply in any meaningful way to the operand of delete
in a delete-expression. At best, the connection between the two is extremely tenuous, and a number of expressions are allowed as operands to delete
which are not valid to pass to void ::operator delete(void*)
. For example:
I hope this shows that whether a pointer may be passed to void operator delete(void*)
has no bearing on whether that same pointer may be used as the operand of delete
.
c++ - 销毁对象放置新后未调用析构函数
我不知道为什么这不起作用。以下Function
是由placement new 创建的。提供了一个函数来检查它是否应该被破坏,如果是,则手动调用它的析构函数。
这是似乎从未调用析构函数的测试用例:
我像下面这样使用它。将下面的代码减少到仍然存在问题的最低限度。当然,在我的实际程序中,内存是从分配器以另一种方式分配的。
你可以看到我在 read 行中调用了析构函数~Function()
。编译器接受,但最终并没有调用它:我通过检查它是否真的删除了我给它的 LLVM 代码来验证它(在删除指向的 LLVM 代码之前将一些代码放入析构函数中codeptr
,以防万一Function
有效的)。
后来我才知道是什么原因造成的。你能给我一个解释吗?
c++ - 调用析构方法比较
我只是想知道这三种调用析构函数的方法是否有任何显着/严重的差异。考虑以下代码。还请考虑 中提到的两种情况main()
。
请在回复时具体说明您要回答的情况:案例1或案例2,或两者兼而有之!
另外,我试图以TestUsingPlacementNew()
这种方式编写,但它会引发运行时异常(MSVC++2008)。我不明白为什么:
也许,内存填充和/或对齐可能是原因?
相关主题:销毁对象放置新后未调用析构函数
c++ - 覆盖 new 但告诉 unordered_map 不要使用它
我正在为 C/C++ 编写一个垃圾收集器作为编程练习,其中一部分涉及全局覆盖new
. 但是,垃圾收集器也使用 an unordered_map
(存储指向已分配块的指针),如果地图尝试使用覆盖的 new (我认为它会尝试无限循环),事情会变得严重混乱。为了创建它,我想使用placement new 来避免调用被覆盖的new:
(mem_t 是我定义的结构,但我认为这不相关。)运行时,此代码在 unordered_map 构造函数中出现段错误。我认为使用placement new 可以解决问题,但显然不是。我很确定 unordered_map 在内部调用 new 。会给它一个分配器(我该怎么做?)解决这个问题?如果不是,这个问题可以解决吗?
c++ - char 数组作为放置 new 的存储
以下合法的 C++ 是否具有明确定义的行为?
或者由于指针转换/对齐考虑,这是否有问题?
c++ - 当显式调用构造函数时,是否构造了初始值设定项和成员变量?
在使用“placement new”时,建议显式调用构造函数和析构函数。
在这种情况下,在类的初始化程序部分中初始化的对象也会正确构造吗?
显式调用析构函数也一样吗?成员对象是否被正确销毁?