在c中,将一个动态分配的对象传递给一个函数(总是)一个坏主意?
我知道问题的标题看起来有点令人头疼,但我真的不知道怎么用一句话来问这个问题.我只会告诉你我的意思:
void f(T *obj) { // bla bla } void main() { f(new T()); } 据我所知,(几乎)每个新的都需要一个删除,这需要一个指针(由new返回).在这种情况下,new返回的指针不存储在任何地方.这会是内存泄漏吗? C是否会在函数结束后删除对象时产生一些魔法(程序员看不见)或者这种做法总是一个坏主意? 解决方法
显示的代码将导致内存泄漏.除非您明确使用专门的框架来提供它,否则C没有垃圾收集.
其原因与在C/C++中管理内存的方式有关.对于局部变量(如您的示例),直接从操作系统(malloc)请求对象的内存,然后在堆栈上存在指向该对象的指针.因为C/C++可以进行任意复杂的指针运算,所以编译器无法知道对象的某处是否存在其他指针,因此当函数f()结束时它无法回收内存. 为了自动防止泄漏,必须从托管堆中分配内存,并且必须仔细跟踪对此堆的每个引用,以确定何时不再使用给定对象.你必须放弃C的指针算术能力才能获得这种能力. 例如,假设编译器可以神奇地弄清楚对obj的所有正常引用都已失效并删除了对象(释放了内存).如果你有一些疯狂复杂的RUNTIME DEPENDENT表达式,如void * ptr =(&&&&(&&& * obj)/ 2 – currenttime() – 567 3 ^ 2%52)等,该怎么办?编译器如何知道这个ptr是否指向obj?没有办法知道.这就是没有垃圾收集的原因.您可以拥有垃圾收集或复杂的运行时指针算法,而不是两者. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |