草庐IT

delete-orphan

全部标签

c++ - 为什么数组有特殊的new和delete?

使用delete而不是delete[]有什么问题?在分配和释放数组的背后是否发生了一些特别的事情?为什么会不同于malloc和free? 最佳答案 使用new[]创建的对象必须使用delete[]。使用delete在数组上是未定义的。使用malloc和free时,情况会更简单。只有1个函数可以释放您分配的数据,也没有调用析构函数的概念。混淆只是因为delete[]和delete看起来相似。实际上它们是两个完全不同的功能。使用delete不会调用正确的函数来删除内存。它应该调用delete[](void*)但它却调用delete(vo

c++ - 编译器会优化 malloc/free 或 new/delete 对到 alloca

有没有成熟的C/C++编译器,能够优化malloc/free(或者new/delete)对信息alloca?换句话说,从基于堆的内存转换为基于堆栈的内存(仅适用于某些有限的情况)。只有当两个函数在同一个函数中(甚至在同一block{}中)时,才允许对malloc/free进行这种优化,并且每次malloc时都会调用free叫做。另外,让我们考虑一下指向malloced内存的指针没有保存在某个全局变量中。那么,GCC/LLVM+clang/Intel编译器是否会转换这样的代码块:{char*carray;carray=malloc(100);//ormalloc(N)//somestri

c++ - 编译器会优化 malloc/free 或 new/delete 对到 alloca

有没有成熟的C/C++编译器,能够优化malloc/free(或者new/delete)对信息alloca?换句话说,从基于堆的内存转换为基于堆栈的内存(仅适用于某些有限的情况)。只有当两个函数在同一个函数中(甚至在同一block{}中)时,才允许对malloc/free进行这种优化,并且每次malloc时都会调用free叫做。另外,让我们考虑一下指向malloced内存的指针没有保存在某个全局变量中。那么,GCC/LLVM+clang/Intel编译器是否会转换这样的代码块:{char*carray;carray=malloc(100);//ormalloc(N)//somestri

c++ - =delete 有哪些用途?

这个问题在这里已经有了答案:c++syntax:defaultanddeletemodifiers(1个回答)关闭9年前。今天早些时候我问aquestion这导致了另一个问题:我应该什么时候使用=delete?我认为没有专门针对SO上的=delete的帖子,因此我在一本名为“C++编程语言”的书中查找了它。我将在下面的答案中列出我的发现。如果有更多要说或我弄错了,请发表评论或回答。 最佳答案 事实证明,=delete非常有用!以下是几个例子:基本上我们可以防止复制基类,因为它可能经常导致切片:structBase{Base(){}B

c++ - =delete 有哪些用途?

这个问题在这里已经有了答案:c++syntax:defaultanddeletemodifiers(1个回答)关闭9年前。今天早些时候我问aquestion这导致了另一个问题:我应该什么时候使用=delete?我认为没有专门针对SO上的=delete的帖子,因此我在一本名为“C++编程语言”的书中查找了它。我将在下面的答案中列出我的发现。如果有更多要说或我弄错了,请发表评论或回答。 最佳答案 事实证明,=delete非常有用!以下是几个例子:基本上我们可以防止复制基类,因为它可能经常导致切片:structBase{Base(){}B

c++ - "delete p; p = NULL(nullptr);"是反模式吗?

在SO上搜索一些东西,我偶然发现了thisquestion并且对投票最多的答案的评论之一(对投票最多的答案的第五条评论)表明deletep;p=NULL;是一个反模式。我必须承认,我碰巧经常使用它,有时\大多数时候使用检查if(NULL!=p)。TheMan他本人似乎建议这样做(请参阅destroy()函数示例),所以我真的很困惑为什么将其视为antipattern可能是一件可怕的事情。我使用它的原因如下:当我释放一个资源时,我还想使它失效以供进一步使用,而NULL是说指针无效的正确工具我不想留下悬空指针我想避免双重\多重免费错误-删除NULL指针就像一个nop,但删除一个悬空指针就像

c++ - "delete p; p = NULL(nullptr);"是反模式吗?

在SO上搜索一些东西,我偶然发现了thisquestion并且对投票最多的答案的评论之一(对投票最多的答案的第五条评论)表明deletep;p=NULL;是一个反模式。我必须承认,我碰巧经常使用它,有时\大多数时候使用检查if(NULL!=p)。TheMan他本人似乎建议这样做(请参阅destroy()函数示例),所以我真的很困惑为什么将其视为antipattern可能是一件可怕的事情。我使用它的原因如下:当我释放一个资源时,我还想使它失效以供进一步使用,而NULL是说指针无效的正确工具我不想留下悬空指针我想避免双重\多重免费错误-删除NULL指针就像一个nop,但删除一个悬空指针就像

c++ - GCC 拒绝在 PowerPC 上对 operator new/delete 发出长时间的调用

PowerPC分支只有24位可用于目标偏移量,因此如果文本部分变得太大,一端的分支将无法到达另一端的目标。有更长的指令序列可以到达更远的目标(偏移量是32位而不是24位),但GCC默认不使用它,除非您将其传递给-mlongcall选项。然而,即使打开了这个选项,GCC仍然会为某些函数生成短调用,即operatornew和operatordelete例如,给定以下代码:externvoidfoo();intmain(intargc,char**argv){foo();newchar;}正常运行GCC将生成程序集:bl_Z3foov//voidfoo()bl_Znwj//operatorn

c++ - GCC 拒绝在 PowerPC 上对 operator new/delete 发出长时间的调用

PowerPC分支只有24位可用于目标偏移量,因此如果文本部分变得太大,一端的分支将无法到达另一端的目标。有更长的指令序列可以到达更远的目标(偏移量是32位而不是24位),但GCC默认不使用它,除非您将其传递给-mlongcall选项。然而,即使打开了这个选项,GCC仍然会为某些函数生成短调用,即operatornew和operatordelete例如,给定以下代码:externvoidfoo();intmain(intargc,char**argv){foo();newchar;}正常运行GCC将生成程序集:bl_Z3foov//voidfoo()bl_Znwj//operatorn

c++ - boost::checked_delete 的目的

我不明白boost::checked_delete的目的。文档说:TheC++Standardallows,in5.3.5/5,pointerstoincompleteclasstypestobedeletedwithadelete-expression.Whentheclasshasanon-trivialdestructor,oraclass-specificoperatordelete,thebehaviorisundefined.Somecompilersissueawarningwhenanincompletetypeisdeleted,butunfortunately,no