草庐IT

expose_new

全部标签

c++ - 为什么 C++ 编译器不消除 new 返回的指针的空检查?

最近我在ideone.com(gcc-4.3.4)上运行了以下代码#include#include#include#includeusingnamespacestd;void*operatornew(size_tsize)throw(std::bad_alloc){void*ptr=malloc(2*1024*1024*1024);printf("%p\n",ptr);returnptr;}voidoperatordelete(void*ptr){free(ptr);}intmain(){char*ptr=newchar;if(ptr==0){printf("unreachable\n

c++ - 除了分配和 ctor 调用之外,C++ new 运算符还做什么?

除了分配内存和调用构造函数之外,new运算符还做了哪些其他事情? 最佳答案 C++标准对来自的new运算符的单个对象形式(通常使用的形式)有这样的说法。header:Requiredbehavior:Returnanonnullpointertosuitablyalignedstorage(3.7.3),orelsethrowabad_allocexception.Thisrequirementisbindingonareplacementversionofthisfunction.Defaultbehavior:—Executes

c++ - 我可以告诉在 C++ 中使用 "new type[n]"创建的数组的大小吗?

使用C++11,我喜欢创建一个bool数组并立即清除它bool*mymap=newbool[n];n是可变的。现在,这是否已经清除了数组占用的内存?如果不是,是否有比对所有元素使用循环并将每个元素分别设置为false更好的方法来清除数组?我考虑过使用std:memset(),但这需要我知道数组的大小。现在,初学者可能会说:简单,大小是n*sizeof(bool)。但我不买那个。编译器可能决定以不同方式打包它们,甚至将它们打包为位,不是吗?那么,有没有办法更清楚地告诉数组的大小呢?我想可能有一个std:arraysize()函数,它只返回内存中分配的数组的空间。毕竟,必须以某种方式在运行

C++ new * char 不为空

我有一个问题。我在ASIO中开发服务器,数据包在尖角字符中。当我创建新的char(例如char*buffer=newchar[128];)时,我必须手动将其清除为null。通过:for(inti=0;i我做错了什么,那个字符不清楚? 最佳答案 您不必遍历未初始化值的数组。您可以像这样动态实例化零数组:char*buffer=newchar[128]();//allelementssetto0^^ 关于C++new*char不为空,我们在StackOverflow上找到一个类似的问题:

c++ - 什么时候在 C++ 中使用 new?

什么时候使用“new”创建一个类的实例有什么好的策略?我对C++编程已经有一段时间了,但我仍然不确定什么时候是这样做的最佳时机:MyClassthing(param1,param2);关于这个:MyClass*thing;thing=newMyClass(param1,param2);有什么建议吗? 最佳答案 在设计方面,尽可能使用自动(堆栈)分配。每当您需要将对象的生命周期延长到某个范围之外时,然后动态分配它。即便如此,也永远不要动态分配原始的东西。始终将它们包装到某种实现范围绑定(bind)资源管理的包装器中(SBRM,最初以愚

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++ - `new (std::nothrow)`是如何实现的?

我有一个C++程序,其中重载了new运算符。问题是如果我在new运算符中的分配失败,我仍然会调用构造函数。我知道我可以通过抛出std::bad_alloc来避免这种情况,但我不想那样做。我怎样才能在重载的new运算符中失败并且仍然不调用我的构造函数?本质上,我想实现类似new(std::nothrow)的东西。这里有一个例子来说明我的意思。请注意我正在测试的系统on没有内存保护。所以访问NULL不会做任何事情示例1:重载新运算符#include#include#includeclassTest{public:Test(void){printf("Testconstructor\n");

c++ - 如何为多个堆重载 new 运算符?

在具有两个独立RAM内存区域的嵌入式系统中,我有两个不同的堆(一个是FreeRTOS在较低内存区域中的自定义实现,另一个是由GCC在较高内存区域中生成的堆)我想能够选择新使用的堆。 最佳答案 您可以提供一个operatornew重载,它接受第二个参数,告诉它从哪个内存区域分配内存。您可以将参数放在operatornew中,方法是将参数放在new表达式中类型之前的括号中。这通常用于将对象new到已分配的存储中(因为这是标准库提供的重载),但是任何东西都可以传递到那里,并将传递给operatornew。enumMemoryArea{LO

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表示“如果为生命周期已结