百科问答小站 logo
百科问答小站 font logo



C++函数收到一个指针T* ptr,没有其他信息,如何判断应该用delete还是delete[]? 第1页

  

user avatar   pansz 网友的相关建议: 
      

这种情况下不要使用任何释放的方法,除非函数明确要求你释放。

在C++中的约定是谁分配谁释放,如果函数需要分配空间,需要由函数调用者分配,并且把分配的空间通过参数传给函数,然后函数写入内容之后返回。分配方与释放方都是同一方,所以不存在不知道该怎么释放的问题。

C++里面你可以设计出几十种不同的内存分配方法,如果不是你自己分配的,是根本不可能正确释放的。

如果一定要调用方释放,那么函数需要在接口中明确告知如何释放,怎样释放,如果函数没有写,那么就不要释放,因为用错误的方法释放可能会直接造成程序崩溃,而不释放仅仅只是多占用了一点点内存而已。

所以重复一遍:如果你不知道应该怎么释放,那么就不要释放。


user avatar   haozhi-yang-41 网友的相关建议: 
      

没有任何判断的可能——人家甚至可能就传进来了个静态变量,或者静态数组。

要解决这类问题,有几个思路:

  1. 最通常的做法是不释放。
  2. 次之的做法是在文档(注释)里做调用约定——违者后果自负。
  3. 统一用T::release之类的方法释放,内部怎么实现你不管——他要不实现这个函数,你就让他编不过。
  4. 可以尝试下传进来个shared_ptr。


user avatar   james-98-78 网友的相关建议: 
      

根本不能随便释放,因为不知道这个指针来自哪个堆哪种分配方式,甚至不知道这是不是一个堆指针。释放错误程序直接崩溃。

这种情况不得不提一嘴COM,它的指针是自带释放函数的,就是Release,虽然这玩意已经是明日黄花,但理念就很好。




  

相关话题

  为什么现在招聘C++程序员这么难? 
  C# 和 Java 哪个更像 C++? 
  为什么时效上具有明显优势的基数排序(radix sort)没有快速排序流行? 
  C++ 和Java 的 double 类型都是 8 字节,为何 C++ 存不下 3.1415926 ? 
  学校和机构都建议孩子放弃 Python 转 C++,我该如何处理? 
  为什么大多数人用C++时都要用&&,||和!来表示与或非,而不是用and or not? 
  C++原子变量数组能用memset置空吗? 
  c++ 中明明有vector了为什么还要有stack? 
  std::list::sort 用了什么算法?为什么速度这么快? 
  C++ 中 new 和定位 new 的返回值都是 void*,却为什么可以被赋值给不同类型的指针? 

前一个讨论
如何评价《原神》中,下雨以后所有的人物都没有打伞的设计?
下一个讨论
半导体散热器不能内置到手机里吗?





© 2025-04-04 - tinynew.org. All Rights Reserved.
© 2025-04-04 - tinynew.org. 保留所有权利