草庐IT

c++ - 为什么 C++ 运算符 new/delete/variants 不应该在头文件中?

有人能解释一下这个C++编译错误的性质吗?我正在涉足/学习重载全局运算符new、delete及其变体。我读了coupleofarticlesonthesubject,但我找不到一个似乎专门解决这个问题的。守则foo.h:#ifndeffoo_h#definefoo_hvoid*operatornew(size_t);void*operatornew[](size_t);voidoperatordelete(void*);voidoperatordelete[](void*);#endif//foo_hfoo.cpp:#include#includevoid*operatornew(si

c++ - 在哪里可以找到 GNU stdc++ operator new 的源代码?

我在这里试过:http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/index.html我找到了new.h,但没有找到实现它的代码。谢谢 最佳答案 libstdc++相关源码可在线浏览here.您可能想阅读this. 关于c++-在哪里可以找到GNUstdc++operatornew的源代码?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/qu

c++ - 在从放置 new 获得的指针上使用 operator delete 的合法性

我很确定这段代码应该是非法的,因为它显然不起作用,但它似乎是C++0xFCD允许的。classX{/*...*/};void*raw=malloc(sizeof(X));X*p=new(raw)X();//accordingtothestandard,theRHSisaplacement-newexpression::operatordelete(p);//definitelywrong,perlitb'sanswerdeletep;//legal?Ihopenot也许你们中的一位语言律师可以解释标准是如何禁止这样做的。还有数组形式:classX{/*...*/};void*raw=m

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