草庐IT

placements

全部标签

c++ - 是否正在使用 placement-new,复制存储然后访问值未定义行为?

设S是一个结构类型,它包含一个字符数组data,它具有最大对齐和固定大小。这个想法是S能够存储任何类型T的对象,其大小不超过限制并且是平凡复制构造和平凡可破坏的。staticconstexprstd::size_tMaxSize=16;structS{alignas(alignof(std::max_align_t))chardata[MaxSize];};Placement-new用于构造一个T类型的对象到一个新的S对象的字符数组中。然后该对象被复制任意次数,包括返回和按值传递。templateSwrap(Tt){static_assert(sizeof(T),"");static_

c++ - 使用 placement new[] 有什么问题?做

考虑下面的程序。它已从一个复杂的案例中简化而来。它无法删除以前分配的内存,除非我删除Obj类中的虚拟析构函数。我不明白为什么程序输出的两个地址不同,只有存在虚拟析构函数时才不同。//GCC4.4#includeusingnamespacestd;classArena{public:void*alloc(size_ts){char*p=newchar[s];cout(p);//theprogramfailshere}};structObj{void*operatornew[](size_ts,Arena&a){returna.alloc(s);}virtual~Obj(){}//ifIr

c++ - 在泛型编程中使用 placement new

在泛型代码中使用placementnew在指定地址构造对象时,使用模式与通常的代码有点不同。例如,考虑uninitialized_copy的实现:([uninitialized.copy])templateForuninitialized_copy(Itfirst,Itlast,Fordest){usingT=typenamestd::iterator_traits::value_type;for(;first!=last;++first,(void)++dest)::new(static_cast(std::addressof(*dest)))T(*first);}这篇文章从标准的角

c++ - C++ 中 placement new 执行的完整操作列表是什么?

在thisquestion讨论了在编译器不支持new和放置new时创建工厂方法。显然,如果通过放置new完成的所有必要步骤都以某种方式重现,则可以使用malloc()制作一些合适的解决方案。放置新有什么作用-我将尝试列出并希望不要遗漏任何内容-除了以下内容?递归调用所有基类的构造函数为所有成员变量调用构造函数和初始值设定项(如果有的话)相应地设置vtable指针。还有哪些Action? 最佳答案 Placementnew除了分配内存之外,它做了常规new会做的所有事情。我认为您基本上已经确定了发生的事情,并做了一些小的说明:显然类本

c++ - char 数组作为 placement new 的存储

以下是否具有明确定义的行为的合法C++?classmy_class{...};intmain(){charstorage[sizeof(my_class)];new((void*)storage)my_class();}或者由于指针转换/对齐方面的考虑,这是有问题的吗? 最佳答案 是的,这是有问题的。您根本无法保证内存正确对齐。虽然存在各种技巧来获得正确对齐的存储,但您最好使用Boost或C++0x的aligned_storage,它们对您隐藏了这些技巧。那么你只需要://C++0xtypedefstd::aligned_stora

c++ - 我们还需要 "placement new"和 "operator new"吗?

allocator似乎与“placementnew”和“operatornew”做了同样的工作。界面更方便。例如:string*ps=static_cast(operatornew(sizeof(string)));new(ps)string("Hello");cout可以重写为allocatoras;string*ps2=as.allocate(1);as.construct(ps2,"Hello");cout那么这意味着“placementnew”和“operatornew”已经过时了吗? 最佳答案 他们仍然需要。您将如何实现您

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

背景:我有一个包含许多变量的复杂类。我有一个可靠且经过测试的复制构造函数:Applepie::Applepie(constApplepie©):m_crust(copy.m_crust),m_filling(copy.m_filling){}在初始化列表中调用的一些成员变量拷贝构造函数执行分配。问题:我需要创建operator=。我可以简单地执行以下操作,而不是使用赋值而不是初始化列表来复制现有的构造函数,并释放正在被替换的内存等等,而是可以简单地执行以下操作:Applepie&Applepie::operator=(constApplepie©){if(this!=&

c++ - 为什么销毁被 placement new 覆盖的对象不是未定义的行为?

我想弄清楚以下是否是未定义的行为。我感觉它不是UB,但我对标准的阅读使它看起来像是UB:#includestructA{A(){std::cout引用C++11标准:basic.life¶4说“程序可以通过重用对象占用的存储来结束任何对象的生命周期”所以在new(&a)A之后,原来的A对象已经结束了它的生命周期。class.dtor¶11.3说“当创建对象的block退出([stmt.dcl])时,为具有自动存储持续时间([basic.stc.auto])的构造对象隐式调用析构函数”因此当main退出时,原始A对象的析构函数被隐式调用。class.dtor¶15表示“如果为生命周期已结

c++ - Placement-new 是否引入了序列点?

考虑以下代码行:new(p++)T();如果构造函数T()抛出异常,是否保证p已经自增? 最佳答案 来自5.3.4[expr.new](引自n3242):11Thenew-placementsyntaxisusedtosupplyadditionalargumentstoanallocationfunction.Ifused,overloadresolutionisperformedonafunctioncallcreatedbyassemblinganargumentlistconsistingoftheamountofspace

c++ - C++ 构造 "placement new"的用途是什么?

我刚刚了解了名为“placementnew”的C++构造。它允许您精确控制指针在内存中指向的位置。它看起来像这样:#include//Must#includethistouse"placementnew"#include"Fred.h"//DeclarationofclassFredvoidsomeCode(){charmemory[sizeof(Fred)];void*place=memory;Fred*f=new(place)Fred();//CreateapointertoaFred(),//storedat"place"//Thepointersfandplacewillbee