如果我声明一个临时自动删除的字符缓冲区使用std::auto_ptrbuffer(newchar[n]);然后当缓冲区超出范围时,缓冲区会被自动删除。我会假设缓冲区是使用delete删除的。但是缓冲区是使用new[]创建的,所以严格来说应该使用delete[]删除缓冲区。这种不匹配可能导致内存泄漏的可能性有多大? 最佳答案 对用new[]分配的指针调用delete的行为是undefined.如您所料,auto_ptrdoescalldelete当智能指针超出范围时。您需要担心的不仅仅是内存泄漏——崩溃和其他奇怪的行为也是可能的。如果
有没有办法使用new关键字在堆栈上分配(alaalloca)而不是堆上(malloc)?我知道我可以自己破解,但我不想这样做。 最佳答案 要在堆栈上分配,要么将你的对象声明为局部变量按值,或者你可以实际使用alloca获取指针,然后使用就地new运算符:void*p=alloca(sizeof(Whatever));new(p)Whatever(constructorArguments);但是,虽然使用alloca和in-placenew可确保在返回时释放内存,但您放弃了自动析构函数调用。如果您只是想确保在退出范围时释放内存,请考虑
为什么这是一个错误:typedefintH[4];H*h=newH;//error:cannotconvert'int*'to'int(*)[4]'ininitialization?此外,为什么这不是错误:H*h=newH[1];?为什么编译器认为newH返回的是int*,而newH[1]返回的是H*符合预期?换一种说法:为什么T*t=newT;对于一般类型T是正确的,而T却不正确>是数组类型?通过new分配简单数组类型的规范方法是什么?请注意,这是一个简化的示例,例如newint[4]不是可接受的解决方法-我需要使用前面typedef中的实际类型。还请注意,我知道使用std::vec
Wikipedia状态:Atypecanbemadeimpossibletoallocatewithoperatornew:structNonNewable{void*operatornew(std::size_t)=delete;};Anobjectofthistypecanonlyeverbeallocatedasastackobjectorasamemberofanothertype.Itcannotbedirectlyheap-allocatedwithoutnon-portabletrickery.(Sinceplacementnewistheonlywaytocallaco
出于好奇,以下是否合法?X*p=static_cast(operatornew[](3*sizeof(X)));new(p+0)X();new(p+1)X();new(p+2)X();delete[]p;//AmIallowedtousedelete[]here?Orisitundefinedbehavior?同样:X*q=newX[3]();(q+2)->~X();(q+1)->~X();(q+0)->~X();operatordelete[](q); 最佳答案 我很确定两者都给UB。§5.3.4/12说新表达式的数组形式可能会给
这段代码会导致内存泄漏吗?#includeclassMyClass{public:MyClass(){throwstd::runtime_error("Test");}};intmain(){try{MyClass*myClass=newMyClass;}catch(conststd::exception&exc){//Memoryleak?}return0;}new分配的内存永远不会被删除。这是内部处理的,还是实际的内存泄漏? 最佳答案 内存会在异常传播之前自动释放。这是必不可少的,因为a)程序永远不会收到指向free的指针,并且
这个问题在这里已经有了答案:关闭12年前.PossibleDuplicate:WillnewreturnNULLinanycase?假设我有一个类Car,我创建了一个对象Car*newcar=newCar();if(newcar==NULL)//isitvalidtocheckforNULLifnewrunsoutofmemory{} 最佳答案 在符合标准的C++实现中,没有。new的普通形式永远不会返回NULL;如果分配失败,会抛出std::bad_alloc异常(new(nothrow)形式不会抛出异常,会返回NULL如果分配失
intmain(){void*Foo=new???deleteFoo;}你是怎么做类似上述的事情的?你不能放newvoid[size]。而且我不想知道如何使用malloc()和free()来做到这一点。我已经知道这行得通。我很好奇,想知道new和delete是怎么做的。我在谷歌上搜索了一下,看到了一些关于operatornew(size);和operatordelete(size);这些和new/delete有什么区别?为什么C++不仅仅允许newvoid*[size]? 最佳答案 这样就可以了:intmain(){void*Foo
考虑以下代码:example_t*a=newexample_t[8];classexample_t具有可以抛出的默认ctor,假设构造数组中的第5个元素会抛出。是否会自动调用前4个元素的析构函数?这是一种定义明确的行为吗? 最佳答案 这是完美的定义和良好的行为。如果对象的初始化以异常终止,则所有完全构造的子对象都将被销毁,其构造顺序与它们的构造相反。这对于数组和用户定义类型的对象是一样的(想想类和类成员)。正式来说,我们有C++1115.2/2:Anobjectofanystoragedurationwhoseinitializat
当你使用new[]分配一个数组时,为什么你不能从指针中找出那个数组的大小呢?它必须在运行时知道,否则delete[]将不知道要释放多少内存。除非我错过了什么? 最佳答案 在典型的实现中,动态内存块的大小以某种方式存储在block本身中-这是真的。但是没有标准的方式来访问这些信息。(实现可以提供特定于实现的方式来访问它)。malloc/free就是这样,new[]/delete[]也是这样。事实上,在典型的实现中,new[]/delete[]调用的原始内存分配最终由一些实现特定的malloc/free类对处理,这意味着delete[]