jjzjj

delete_article

全部标签

c++ - C++中的delete如何知道要删除多少个内存位置

删除运算符是如何工作的?它比free()更好吗?此外,如果您执行ptr=newchar[10],然后使用deleteptr删除,指针如何知道要删除多少个位置。 最佳答案 只有delete操作符,free只作为函数存在。在C++下,我们鼓励您使用new/delete而不是malloc()/free()。删除运算符有一个内部的“魔法”。当使用new[]创建数组时,数组的大小存储在内存块的元数据中。delete[]使用该信息。所有这些当然都依赖于编译器、操作系统、优化器和实现。 关于c++-C

c++ - 如果使用 delete 而不是 free 删除使用 malloc 分配的内存怎么办

我遇到了一个我无法解决的问题。我的问题是,如果我使用malloc分配内存,然后使用delete删除内存块?一般的经验法则是Ifweallocatememoryusingmalloc,itshouldbedeletedusingfree.Ifweallocatememoryusingnew,itshouldbedeletedusingdelete.现在,为了检查如果我们反过来会发生什么,我写了一个小代码。#include#include#includeusingnamespacestd;classA{intp=10;public:intlol(){returnp;}};intmain()

c++ - 哪个版本的 safe_delete 更好?

#defineSAFE_DELETE(a)if((a)!=NULL)delete(a);(a)=NULL;或templatevoidsafe_delete(T*&a){deletea;a=NULL;}或者其他更好的方式 最佳答案 我不会说两者都不是,因为两者都会给您一种虚假的安全感。例如,假设您有一个函数:voidFunc(SomePtr*p){//stuffSafeDelete(p);}您将p设置为NULL,但函数外的p拷贝不受影响。但是,如果您必须这样做,请使用模板-宏总是有可能影响其他名称。

c++ - 有没有办法让 "delete"成为一个纯虚函数?

我有一个带有几个纯虚函数的抽象类,我从它派生的类之一不使用其中一个纯虚函数:classderivative:publicbase{public:intsomevariable;voidsomefunction();};无论如何,当我尝试编译它时,我得到一个错误(显然,如果从抽象类派生并且不覆盖所有纯虚函数,类仍然被认为是抽象的)。无论如何,定义一个函数似乎毫无意义intpurevirtfunc(){return0;}只是因为它需要通过技术来定义。无论如何从抽象类派生类而不使用抽象类的纯虚函数之一? 最佳答案 如果派生类不“使用”基类

c++ - 为什么 std::shared_ptr 从基类和派生类调用析构函数,而 delete 只调用基类的析构函数?

这个问题在这里已经有了答案:Howisitpossible(ifitis)toimplementshared_ptrwithoutrequiringpolymorphicclassestohavevirtualdestructor?(3个答案)关闭8年前。为什么在使用std::shared_ptr释放时从基类和派生类调用析构函数,而第二个示例仅从基类调用析构函数?classBase{public:~Base(){std::coutsharedA(newDerived);}std::cout输出:--------------------DeriveddestructorBasedestr

c++ - delete[] (ptr, 0) 的行为

是否定义了这段代码的行为?int*ptr=newint[10];operatordelete[](ptr,0);这段代码编译得很好,(在我的机器上)似乎什么也没发生。它的行为是否在某处定义? 最佳答案 在这个声明中operatordelete[](ptr,0);显式调用了释放函数voidoperatordelete[](void*,std::size_t)noexcept;调用中类型为size_t的第二个参数刚设置为0。当分配的内存大小不等于0时,第二个参数等于0的调用行为是未定义的。

c++ - 在派生类中重写运算符 new/delete

我有一个无状态的抽象基类,各种具体类都从中继承。其中一些派生类也是无状态的。因为它们中的许多是在运行期间创建的,所以我想通过覆盖运算符new()/delete()让所有无状态派生类模拟单例来节省内存和开销。一个简化的例子看起来像这样:#includestructBase{virtual~Base(){}protected:Base(){}//preventconcreteBaseobjects};structD1:publicBase{//statefulobject--defaultbehaviorintdummy;};structD2:publicBase{//statelesso

c++ - 显式删除析构函数而不调用 delete

我正在阅读C++11FAQ并注意到这一点:classX4{~X4()=delete;//Disallowdestruction}ThisimplicitlyalsodisallowsmovingofX4s.Copyingisallowed,butdeprecated.我还找到了thisquote.Deletingthedefinitionofadestructorwillrequireallocationonthefree-storebecausestaticandautomaticobjectsimplicitlyinvokethedestructor:`structC{~C()=d

c++ - 什么时候调用 __cxa_deleted_virtual

我尝试为avrc++构建构建一个小测试用例集。通常从c++库中提供一些“异常函数”。现在我想编写一个测试程序来生成必须链接到__cxa_deleted_virtual的错误代码。任何人都可以提供导致链接到该函数的代码片段吗?我实际上不知道如何生成这个“有问题”的代码。 最佳答案 用于填充已定义为已删除的虚函数的虚表槽:structB{virtualvoidf()=delete;};structD:B{virtualvoidf()=delete;};(被删除的虚函数包含在vtable中的原因是thisallowsittobelater

c++ - delete[] 是否在调用析构函数后一次性释放内存?

据我所知,当我们在由相应的new[]创建的指针上写入delete[]时,程序将在数组中查找记帐信息并找出数组的元素大小(一个计数器)。然后程序对它们中的每一个调用元素的析构函数。最后,内存(什么内存??)由名为operatordelete的函数释放。我想问的是delete[]是否会在一次中释放由new[]表达式分配的整个内存因为该信息(总内存量)在所有元素都被销毁后可用,还是它会成功释放调用析构函数的数组元素占用的内存?相关后续问题被问到Doesdelete(nonarrayform)knowthetotalamountofmemoryallocatedbyeithernewornew