摘自标准20.12[function.objects]:templatereference_wrapperref(T&)noexcept;templatereference_wrappercref(constT&)noexcept;templatevoidref(constT&&)=delete;templatevoidcref(constT&&)=delete;我习惯于在成员函数的上下文中看到=delete。目的是禁止编译器提供的操作。例如,使类不可复制或不可移动。然而,在这种情况下,意图似乎是意图的文档。这是正确的吗?在其他情况下,在非成员函数上使用=delete是可取、可取或不可
当我执行这段代码时实际发生了什么?classMyClass{MyClass(){//dosomethingdeletethis;}} 最佳答案 注意:此答案适用于C++03,并且似乎在C++11及更高版本中行为已更改,因此现在这是未定义的行为。事实证明,在这种特殊情况下,代码是合法的,但您远离未定义的行为。C++03标准将对象的“生命周期”定义为构造函数完成运行与析构函数开始运行之间的时间。它还明确指出(在§3.8/5中)Beforethelifetimeofanobjecthasstarted[...]Iftheobjectwil
首先,根据C++标准,对使用new[]分配的任何内容使用delete是未定义的行为。在VisualC++7中,这种配对可能导致两种后果之一。如果new[]'ed类型具有简单的构造函数和析构函数VC++只需使用new而不是new[]并使用delete该block工作正常-new只是调用“分配内存”,delete只是调用“空闲内存”。如果new[]'ed类型具有非平凡的构造函数或析构函数,则上述技巧无法完成-VC++7必须调用正确数量的析构函数。所以它在数组前面加上一个存储元素数量的size_t。现在new[]返回的地址指向第一个元素,而不是block的开头。因此,如果使用delete它只
在thisparagraphofC++FAQ讨论了deletethis构造的用法。列出了4个限制。限制1到3看起来很合理。但是为什么有限制4我“不能检查它,将它与另一个指针比较,将它与NULL比较,打印它,强制转换它,用它做任何事情”?我的意思是this是另一个指针。为什么我不能将其reinterpret_cast转换为int或调用printf()来输出其值? 最佳答案 调用delete后'this'的值是未定义的,你对它所做的任何事情的行为也是未定义的。虽然我希望大多数编译器做一些明智的事情,但没有什么(在规范中)阻止编译器决定它
关于new和delete的使用,以及Stroustrup的建议……他说了类似的话(但不完全是,这是我在他书中的笔记):Aruleofthumbisthat,newbelongsinconstructorsandsimilaroperations,deletebelongsindestructors.Inaddition,newisoftenusedinargumentstoresourcehandles.Otherwiseavoidusingnewanddelete,useresourcehandles(smartpointers)instead.我想知道C++11经验丰富的人是否真的
我已经分配了对象数组Objects*array=newObjects[N];我应该如何删除这个数组?只是delete[]array;或者迭代数组的元素?for(inti=0;i谢谢更新:我把循环体改成了delete&array[i];强制代码编译。 最佳答案 new的每次使用都应该通过delete来平衡,new[]的每次使用都应该通过delete来平衡[].for(inti=0;i仅当您将数组初始化为:Objects**array=newObjects*[N];for(inti=0;i您的原始代码给您一个编译错误这一事实强烈暗示您做
已解决:可行的解决方案:sbi'sanswer对实际情况的解释:Hans'sanswer解释为什么OpenFile没有通过“DELETEPENDING”:Benjamin'sanswer问题:我们的软件在很大程度上是专有脚本语言的解释器引擎。该脚本语言能够创建文件、处理文件,然后删除文件。这些都是独立的操作,在这些操作之间没有文件句柄保持打开状态。(即在文件创建期间,创建一个句柄,用于写入,然后关闭。在文件处理部分,一个单独的文件句柄打开文件,从中读取,并在EOF时关闭。而最后,delete使用::DeleteFile,它只使用文件名,根本没有文件句柄)。最近我们开始意识到,特定的宏(
我有一个包含两个项目的VisualStudio2005解决方案。一个是静态库,另一个是用于测试静态库中功能的可执行文件。静态库使用MFC。构建解决方案时出现以下错误。uafxcwd.lib(afxmem.obj):errorLNK2005:"void*__cdecloperatornew(unsignedint)"(??2@YAPAXI@Z)alreadydefinedinLIBCMTD.lib(new.obj)uafxcwd.lib(afxmem.obj):errorLNK2005:"void__cdecloperatordelete(void*)"(??3@YAXPAX@Z)alr
考虑:deletenewstd::string[2];delete[]newstd::string;每个人都知道第一个是错误的。如果第二个不是错误,我们就不需要两个不同的运算符。现在考虑:std::unique_ptrx(newint[2]);std::unique_ptry(newint);x是否知道使用delete[]而不是delete?背景:当我认为指针的数组类型限定将是一种方便的语言功能时,这个问题浮现在我脑海中。int*[]foo=newint[2];//OKint*bar=newint;//OKdelete[]foo;//OKdeletebar;//OKfoo=newint
这个问题在这里已经有了答案:Is"deletethis"allowedinC++?(10个回答)关闭5年前.在我最初的基本测试中,这样做是完全安全的。但是,让我感到震惊的是,稍后尝试在delete的this的函数中操作this可能是运行时错误。这是真的吗?deletethis通常安全吗?还是只有某些情况下它是安全的? 最佳答案 deletethis是合法的,并且会执行您所期望的操作:它调用您的类的析构函数并释放底层内存。在deletethis返回后,您的this指针值不会不改变,所以它现在是一个悬空指针,应该不被取消引用。这包括使用