草庐IT

new_order

全部标签

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

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

c++ - Visual Studio 2010 专业版 : Cannot find include file "new.h"

所以我刚刚获得了VisualStudio2010Professional,我创建了一个简单的mfc应用程序,添加了一些代码并且没有更改任何项目设置。当我尝试编译它时,我得到了这个错误:1>------Buildstarted:Project:cadmenu,Configuration:ReleaseWin32------1>Buildstarted10/15/20133:44:26PM.1>InitializeBuildStatus:1>Touching"Release\cadmenu.unsuccessfulbuild".1>ClCompile:1>stdafx.cpp1>C:\Pr

c++ - C++11 中::new 的线程安全

我确信,在实践中,::new的使用是线程安全的。我的问题是标准的哪一部分提供了这种保证,如果有的话?这是一个约定吗?这是否标准为实现提供了很大的自由度(例如关于每种数据类型大小的相对宽松的限制)以支持各种硬件?我希望C++11标准中只有一行明确指定“::new的实现必须是线程安全的”。我也很想看到一些关于operatornew重载的线程安全的标准术语。我想它们也需要要求是线程安全的,但这些函数也不属于const=>线程安全(在C++11中)的全面保证。p>谢谢! 最佳答案 我相信这是由C++11标准隐式保证的。如果不是,则使用ope

c++ - 为什么 new[-1] 会产生 segfault,而 new[-2] 会抛出 bad_alloc?

我尝试通过将一些否定参数传递给new[]来测试bad_alloc异常。当传递小的负数时,我得到了我所希望的-bad_alloc。但是,当传递-1时,我可以看到我的对象被构​​造了数千次(我在构造函数中打印静态计数器)并且应用程序因段错误而终止。new[]将有符号整数转换为size_t,所以-1是size_t和-2是最大值-1以此类推。那么为什么new[]在接收到一个巨大的数字时会抛出异常,但在接收到size_t的最大值时会尝试分配呢?new[]的1111...1和1111...0有什么区别?:)提前致谢! 最佳答案 这是我的猜测:在

c++ - 标准 C++11 是否保证 memory_order_seq_cst 防止 StoreLoad 围绕原子进行非原子重新排序?

标准C++11是否保证memory_order_seq_cst防止StoreLoad围绕非原子内存访问的原子操作重新排序?众所周知,有6个std::memory_orders在C++11中,其指定多么规律,非原子内存访问将围绕原子操作进行排序-工作草案,C++编程语言标准2016-07-12:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf§29.3Orderandconsistency§29.3/1Theenumerationmemory_orderspecifiesthedetailedregular

c++ - 是否使用 new char[] 或 malloc 的结果来转换 float * is IN(严格的别名违规)?

其中哪些代码有UB(具体来说,违反了严格的别名规则)?voida(){std::vectorv(sizeof(float));float*f=reinterpret_cast(v.data());*f=42;}voidb(){char*a=newchar[sizeof(float)];float*f=reinterpret_cast(a);*f=42;}voidc(){char*a=newchar[sizeof(float)];float*f=new(a)float;*f=42;}voidd(){char*a=(char*)malloc(sizeof(float));float*f=r

c++ - 为什么 sgi STL 源代码在 operator new 函数前面使用双冒号?

我正在阅读SGI标准模板库的源代码。我发现operatornew函数前面总是有一个双冒号。像这样:T*tmp=(T*)(::operatornew((size_t)(size*sizeof(T))));operatornew可以不加::字段直接调用,那为什么STLcoder会这样写呢?如果我们不使用它们前面的::,可能会遇到什么陷阱或情况。 最佳答案 您可以为类重载operatornew并在其前面加上"::"将调用全局"default"operatornew而不是可能的重载。例如:#includeclassFoo{public:Fo

c++ - Valgrind 和 "WARNING: new redirection conflicts with existing"

我在Valgrind中得到了这个。--24101--REDIR:0xbb20580(operatordelete(void*))redirectedto0x93b7d48(operatordelete(void*))--24101--REDIR:0xbb22580(operatornew[](unsignedlong))redirectedto0x93b88b7(operatornew[](unsignedlong))==24101==WARNING:newredirectionconflictswithexisting--ignoringit--24101--new:0x156320

c# - new 是否总是在 C++/C#/Java 中的堆上分配

我的理解一直是,无论是C++、C#还是Java,当我们使用new关键字创建对象时,它都会在堆上分配内存。我认为new只有引用类型(类)才需要,而原始类型(int、bool、float等)从不使用new并且总是继续堆栈(除非它们是使用new实例化的类的成员变量)。但是,我一直在阅读information这让我怀疑这个长期存在的假设,至少对于Java和C#。例如,我刚刚注意到在C#中new运算符可用于初始化值类型,请参阅here.这是否是规则的异常(exception),语言的辅助功能,如果是,还会有哪些其他异常(exception)?有人可以澄清一下吗? 最佳

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