草庐IT

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++ - 是否使用 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

c++ - &arr[size] 有效吗?

假设我有一个函数,调用如下:voidmysort(int*arr,std::size_tsize){std::sort(&arr[0],&arr[size]);}intmain(){inta[]={42,314};mysort(a,2);}我的问题是:mysort(更具体地说,&arr[size])的代码是否已经定义了行为?我知道如果替换为arr+size会完全有效;指针算法允许正常指向末尾。但是,我的问题具体是关于&和[]的使用。根据C++115.2.1/1,arr[size]等价于*(arr+size)。引用5.3.1/1,一元*的规则:Theunary*operatorperfo

c++ - 在p=new string[0]和p=new int[0]之后,为什么string版本在delete[] p时会崩溃?

我有两段关于new[]和delete[]的代码:1)#includeintmain(){std::string*p=newstd::string[0];delete[]p;return0;}2)在这种情况下,我只是将std::string更改为intintmain(){int*p=newint[0];delete[]p;return0;}我的问题是:为什么第一个程序崩溃并显示以下消息(在linux环境中):Segmentationfault(coredumped)但是第二个程序运行良好,没有任何错误?编辑编译器:g++(Ubuntu/Linaro4.7.2-2ubuntu1)4.7.2