以下是否具有明确定义的行为的合法C++?classmy_class{...};intmain(){charstorage[sizeof(my_class)];new((void*)storage)my_class();}或者由于指针转换/对齐方面的考虑,这是有问题的吗? 最佳答案 是的,这是有问题的。您根本无法保证内存正确对齐。虽然存在各种技巧来获得正确对齐的存储,但您最好使用Boost或C++0x的aligned_storage,它们对您隐藏了这些技巧。那么你只需要://C++0xtypedefstd::aligned_stora
我有一个这样描述的类:classFoo{intsize;intdata[0];public:Foo(int_size,int*_data):size(_size){for(inti=0;i我无法更改该类的设计。如何创建该类的实例?在调用构造函数之前,我必须让它预留足够的内存来存储它的数据,所以它必须在堆上,而不是在栈上。我想我想要类似的东西Foo*place=static_cast(malloc(sizeof(int)+sizeof(int)*size));*place=newFoo(size,data);//Imean:"usethememoryallocatedinplacetod
最近我在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
除了分配内存和调用构造函数之外,new运算符还做了哪些其他事情? 最佳答案 C++标准对来自的new运算符的单个对象形式(通常使用的形式)有这样的说法。header:Requiredbehavior:Returnanonnullpointertosuitablyalignedstorage(3.7.3),orelsethrowabad_allocexception.Thisrequirementisbindingonareplacementversionofthisfunction.Defaultbehavior:—Executes
使用C++11,我喜欢创建一个bool数组并立即清除它bool*mymap=newbool[n];n是可变的。现在,这是否已经清除了数组占用的内存?如果不是,是否有比对所有元素使用循环并将每个元素分别设置为false更好的方法来清除数组?我考虑过使用std:memset(),但这需要我知道数组的大小。现在,初学者可能会说:简单,大小是n*sizeof(bool)。但我不买那个。编译器可能决定以不同方式打包它们,甚至将它们打包为位,不是吗?那么,有没有办法更清楚地告诉数组的大小呢?我想可能有一个std:arraysize()函数,它只返回内存中分配的数组的空间。毕竟,必须以某种方式在运行
我有一个问题。我在ASIO中开发服务器,数据包在尖角字符中。当我创建新的char(例如char*buffer=newchar[128];)时,我必须手动将其清除为null。通过:for(inti=0;i我做错了什么,那个字符不清楚? 最佳答案 您不必遍历未初始化值的数组。您可以像这样动态实例化零数组:char*buffer=newchar[128]();//allelementssetto0^^ 关于C++new*char不为空,我们在StackOverflow上找到一个类似的问题:
什么时候使用“new”创建一个类的实例有什么好的策略?我对C++编程已经有一段时间了,但我仍然不确定什么时候是这样做的最佳时机:MyClassthing(param1,param2);关于这个:MyClass*thing;thing=newMyClass(param1,param2);有什么建议吗? 最佳答案 在设计方面,尽可能使用自动(堆栈)分配。每当您需要将对象的生命周期延长到某个范围之外时,然后动态分配它。即便如此,也永远不要动态分配原始的东西。始终将它们包装到某种实现范围绑定(bind)资源管理的包装器中(SBRM,最初以愚
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”已经过时了吗? 最佳答案 他们仍然需要。您将如何实现您
背景:我有一个包含许多变量的复杂类。我有一个可靠且经过测试的复制构造函数:Applepie::Applepie(constApplepie©):m_crust(copy.m_crust),m_filling(copy.m_filling){}在初始化列表中调用的一些成员变量拷贝构造函数执行分配。问题:我需要创建operator=。我可以简单地执行以下操作,而不是使用赋值而不是初始化列表来复制现有的构造函数,并释放正在被替换的内存等等,而是可以简单地执行以下操作:Applepie&Applepie::operator=(constApplepie©){if(this!=&
我有一个C++程序,其中重载了new运算符。问题是如果我在new运算符中的分配失败,我仍然会调用构造函数。我知道我可以通过抛出std::bad_alloc来避免这种情况,但我不想那样做。我怎样才能在重载的new运算符中失败并且仍然不调用我的构造函数?本质上,我想实现类似new(std::nothrow)的东西。这里有一个例子来说明我的意思。请注意我正在测试的系统on没有内存保护。所以访问NULL不会做任何事情示例1:重载新运算符#include#include#includeclassTest{public:Test(void){printf("Testconstructor\n");