草庐IT

Delete_btn

全部标签

c++ - 对于 C++ 中的指针,delete 命令真正对内存有什么作用?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C++delete-ItdeletesmyobjectsbutIcanstillaccessthedata?Canalocalvariable'smemorybeaccessedoutsideitsscope?当我想释放用new分配的内存时,我不明白delete究竟做了什么。在C++Premiere书中写道:Thisremovesthememorytowhichpspointerpoints;itdoesn’tremovethepointerpsitself.Youcanreuseps,forexample,

c++ - 将运算符 new[] 和放置 new 与普通 delete[] 混合

出于好奇,以下是否合法?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说新表达式的数组形式可能会给

c++ - delete[] 具有不同类型的未定义行为?

我想知道这是否是未定义的行为:#includeintmain(){auto*p=newuint8_t[32];float*c=reinterpret_cast(p);delete[]c;}在standard有Ifnot,thebehaviorisundefined.Inthesecondalternative(deletearray),thevalueoftheoperandofdeletemaybeanullpointervalueorapointervaluethatresultedfromapreviousarraynew-expression.79Ifnot,thebehavi

c++ - 'delete' 的数组形式是什么?

当我使用数组名作为指针编译代码,并使用delete删除了数组名时,我收到了关于不使用数组形式删除数组的警告(我不记住确切的措辞)。基本代码是:intdata[5];deletedata;那么,delete的数组形式是什么? 最佳答案 delete的数组形式为:delete[]data;编辑:但正如其他人指出的那样,您不应该为这样定义的数据调用delete:intdata[5];您应该只在使用new分配内存时调用它,如下所示:int*data=newint[5]; 关于c++-'delet

c++ - 为什么没有 C++ 的 DELETE 宏的原因

是否有任何好的理由(也许“宏是邪恶的”除外)不使用以下宏?#defineDELETE(ptr)\if(ptr!=NULL)\{\deleteptr;\ptr=NULL;\}#defineDELETE_TABLE(ptr)\if(ptr!=NULL)\{\delete[]ptr;\ptr=NULL;\} 最佳答案 我个人更喜欢以下的templatevoidSafeDelete(T*&pVal){deletepVal;pVal=NULL;}templatevoidSafeDeleteArray(T*&pVal){delete[]pVal

c++ - 您可以在第二个声明中使用 `= delete` 模板函数吗?

考虑以下代码:templateintfoo();templateintfoo()=delete;这是有效的C++11吗?GCC(9.1)说:是的!clang(8.0)说:不!nvcc(9.2)说:不!MSVC(19.20)说:是的!(在C++14模式下,不支持C++11。)...在GodBolt上查看所有内容.那么哪些编译器是正确的,哪些编译器是s@#$%e?:-) 最佳答案 GCC和MSVC有一个错误。[dcl.fct.def.delete]4...Adeleteddefinitionofafunctionshallbethefi

c++ - 声明构造函数私有(private)和 =delete 有什么区别?

例如,我想声明一个类,但我希望客户端不能使用复制构造函数(或复制赋值运算符)以下两种都不允许使用拷贝构造函数:1.classTrack{public:Track(){};~Track(){};private:Track(constTrack&){};};2.classTrack{public:Track(){};~Track(){};Track(constTrack&)=delete;};其中一种方式是否比另一种方式“更正确”或相等?有没有副作用?//Doesnotcompilewithboththeabovewaysintmain(){Trackl;Trackp(l);}

c++ - 对运算符(operator) 'delete' 的调用是同步的吗?

我想知道对运算符delete的调用是否是同步的。换句话说,如果我这样做:deletep;C++标准是否保证只有在此调用完成执行后才会释放内存?或者调用是异步的,并且只是为操作系统安排一个任务来释放这个内存,一旦它决定是这样做的最佳时间?如果第一种情况是有效的,那么这是否意味着我们必须实现自己的异步删除器工具?我问是因为我会说大多数时候我们(程序员)并不关心内存何时被准确释放,因此我们不希望我们的代码卡住并等待这个(很可能很昂贵?)系统调用完成,而是安排删除任务并立即继续执行。C++是否提供任何标准工具(可能通过标准库?)来做到这一点而无需重新发明轮子? 最佳

c++ - 我将如何使用大小运算符 delete/delete[] 以及为什么它们更好?

C++14介绍"sized"versionsofoperatordelete,即voidoperatordelete(void*ptr,std::size_tsz);和voidoperatordelete[](void*ptr,std::size_tsz);通读N3536,似乎引入这些运算符是为了提高性能。我知道operatornew使用的典型分配器在某处“存储”大容量内存的大小,这就是典型的operatordelete如何“知道”返回多少内存免费商店。但我不确定为什么operatordelete的“大小”版本会在性能方面有所帮助。唯一可以加快速度的是关于控制block大小的少读操作。

c++ - 如果你在成员函数中执行 "delete this;"会发生什么?

如果一个成员函数尝试执行deletethis;会发生什么,就像在下面类的构造函数中一样?classA{public:A(int);~A();int*pi;}A::A(inti){deletethis;pi=newint(i);}A::~A(){deletepi;} 最佳答案 ThisC++FAQ条目很好地回答了这个问题,在此重复:只要小心,对象删除这个是可以的。我是这样定义“小心”的:您必须绝对100%确定该对象是通过new分配的(不是通过new[],也不是通过放置new,也不是堆栈上的本地对象,也不是全局对象,也不是另一个对象的成