加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在c中,将一个动态分配的对象传递给一个函数(总是)一个坏主意?

发布时间:2020-12-16 06:46:00 所属栏目:百科 来源:网络整理
导读:我知道问题的标题看起来有点令人头疼,但我真的不知道怎么用一句话来问这个问题.我只会告诉你我的意思: void f(T *obj){ // bla bla}void main(){ f(new T());} 据我所知,(几乎)每个新的都需要一个删除,这需要一个指针(由new返回).在这种情况下,new返回的指
我知道问题的标题看起来有点令人头疼,但我真的不知道怎么用一句话来问这个问题.我只会告诉你我的意思:

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?没有办法知道.这就是没有垃圾收集的原因.您可以拥有垃圾收集或复杂的运行时指针算法,而不是两者.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读