当我使用数组名作为指针编译代码,并使用delete删除了数组名时,我收到了关于不使用数组形式删除数组的警告(我不记住确切的措辞)。基本代码是:intdata[5];deletedata;那么,delete的数组形式是什么? 最佳答案 delete的数组形式为:delete[]data;编辑:但正如其他人指出的那样,您不应该为这样定义的数据调用delete:intdata[5];您应该只在使用new分配内存时调用它,如下所示:int*data=newint[5]; 关于c++-'delet
是否有任何好的理由(也许“宏是邪恶的”除外)不使用以下宏?#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
我正忙于测试各种通用算法的实现,并且我正在使用对所提供函数的支持最少的类型。我在使用std::pair时遇到了这个奇怪的设置某些类型T(例如int)和movable类型定义如下:structmovable{movable(){}movable(movable&&)=default;//movable(movableconst&)=delete;movable(movable&)=delete;};这个想法是有一个可移动但不可复制的类型。这很好用,例如,使用这样的表达式:movablem1=movable();movablem2=std::move(m1);但是,当尝试将此类型用作std
考虑以下代码: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
例如,我想声明一个类,但我希望客户端不能使用复制构造函数(或复制赋值运算符)以下两种都不允许使用拷贝构造函数:1.classTrack{public:Track(){};~Track(){};private:Track(constTrack&){};};2.classTrack{public:Track(){};~Track(){};Track(constTrack&)=delete;};其中一种方式是否比另一种方式“更正确”或相等?有没有副作用?//Doesnotcompilewithboththeabovewaysintmain(){Trackl;Trackp(l);}
我想知道对运算符delete的调用是否是同步的。换句话说,如果我这样做:deletep;C++标准是否保证只有在此调用完成执行后才会释放内存?或者调用是异步的,并且只是为操作系统安排一个任务来释放这个内存,一旦它决定是这样做的最佳时间?如果第一种情况是有效的,那么这是否意味着我们必须实现自己的异步删除器工具?我问是因为我会说大多数时候我们(程序员)并不关心内存何时被准确释放,因此我们不希望我们的代码卡住并等待这个(很可能很昂贵?)系统调用完成,而是安排删除任务并立即继续执行。C++是否提供任何标准工具(可能通过标准库?)来做到这一点而无需重新发明轮子? 最佳
C++14介绍"sized"versionsofoperatordelete,即voidoperatordelete(void*ptr,std::size_tsz);和voidoperatordelete[](void*ptr,std::size_tsz);通读N3536,似乎引入这些运算符是为了提高性能。我知道operatornew使用的典型分配器在某处“存储”大容量内存的大小,这就是典型的operatordelete如何“知道”返回多少内存免费商店。但我不确定为什么operatordelete的“大小”版本会在性能方面有所帮助。唯一可以加快速度的是关于控制block大小的少读操作。
如果一个成员函数尝试执行deletethis;会发生什么,就像在下面类的构造函数中一样?classA{public:A(int);~A();int*pi;}A::A(inti){deletethis;pi=newint(i);}A::~A(){deletepi;} 最佳答案 ThisC++FAQ条目很好地回答了这个问题,在此重复:只要小心,对象删除这个是可以的。我是这样定义“小心”的:您必须绝对100%确定该对象是通过new分配的(不是通过new[],也不是通过放置new,也不是堆栈上的本地对象,也不是全局对象,也不是另一个对象的成
假设我有一个指向动态分配的10个元素的数组的指针:T*p=newT[10];稍后,我想释放那个数组:delete[]p;如果T之一会发生什么?析构函数抛出异常?其他元素还会被破坏吗?内存会被释放吗?异常会被传播,还是会终止程序执行?同样,当std::vector被摧毁,其中一个T析构函数抛出? 最佳答案 我看不到它在标准中明确指出:只是它们会按照创建的相反顺序被调用5.3.5删除[expr.delete]6Ifthevalueoftheoperandofthedelete-expressionisnotanullpointerval
我刚刚读到这篇article并希望得到人们的建议:问:deletethis;应该在成员方法中调用吗? 最佳答案 通常这是一个坏主意,但偶尔会有用。只要你delete后不使用任何成员变量是绝对安全的,只要调用该方法的客户端理解它就可以删除对象。当你的类使用引用计数时,这很有用的一个很好的例子:voidRef(){m_References++;}voidDeref(){m_References--;if(m_References==0){deletethis;}} 关于c++-应该从成员方法