写C C++ 语言时候,如果每次申请内存就把Free内存的代码写上,是否能有效避免内存泄漏?
写C C++ 语言时候,如果每次申请内存就把Free内存的代码写上,是否能有效避免内存泄漏?
-----
网友解答:
-----
我大学的时候想过一个办法,把所有需要用到指针的地方封装进class中,然后在析构函数中做清理。要使用时,先在栈内存中生成这个class的实例,等用完了,栈内存会主动释放掉,这时就会触发class的析构,同步把堆内存也释放掉。我现在有10几年没写c++代码了,细节已经记不清楚了,希望对你有帮助。
-----
网友解答:
-----
不能。什么时候释放是业务逻辑决定的,跟代码什么时候写进去、写在哪里,都没关系,归根结底还是要把各种情况下的逻辑理清楚。用C++的话,张开双臂拥抱标准库的内存处理类吧,基本不用操心释放的问题了。
-----
网友解答:
-----
不可能完全做好,如果要完全做好那就是另一个java。当然可以通过你说的方式进行,但你没有办法禁止c++使用者不通过你的方式使用,那么你所规定的任何东西都失去了意义。就好比银行门口添加无数的保安,加装无数的摄像,看似很安全,然而后墙有一个狗洞直达金库。
-----
网友解答:
-----
简单的逻辑可以这样,复杂的逻辑,有可能申请和释放都不一定在同一个函数中,甚至不在同一个模块中。
-----
网友解答:
-----
建议使用智能指针!C++内存管理确实需要设计好!
申请内存是为了使用,所以要释放也要等到使用完了再释放,那么你什么时候free就是根据实际情况决定的,还有申请内存后还要避免多次释放同一块内存。总之只要你能保证,一次申请对应一次释放那就没问题。但是如果业务过于复杂,代码量大,很难说一定不出问题。所以还是开头建议的,使用智能指针吧!
-----
网友解答:
-----
这个做法是无效的,说明你对相关问题实践少,凭空想象的措施。
首先,既然程序用到堆内存,就意味着不大可能在函数结束後要释放,它要被别的函数使用,否则你直接用栈内存好了。既然会被别的函数使用,你也不可预知被应在哪个函数中释放它,这才是问题!在不该释放的时候释放了,後面的就用了幻影数据,甚至破坏程序和数据(此内存已被挪为他用时)。函数是反复调用的,你不知道它会被调用多少,嵌套多少层,所以不可能确定在什么时候释放相关内存。
其次,是指针会让你这种想法焦头烂额。一块内存的地址,可以用无数指针记忆指向和使用,你free这个指针,但它的化身仍然指向这块内存,它们不知道内存已释放(这就是尽量用引用而不是用指针的原因)。
第三,频繁释放内存会造成内存碎片,而你无法归集。
-----
网友解答:
-----
这个习惯有一定的帮助。
比如写一个构造函数,紧接着把析构函数写好。把逻辑上的“配对”原则先解决掉,可以防止漏掉大多数的收尾工作。
而在C语言中的分配与释放,提前配对写好,显然是有帮助的。
-----
网友解答:
-----
c++肯定不能,举个例子,在申请与释放之间的某条语句抛出了一个异常,不巧这个异常被外围代码补货了,这就造成了内存泄漏。如果是申请互斥元,重入以后肯定死锁。c++的设计原则,raii,资源必须托管给对象,方可万无一失
-----
网友解答:
-----
智能指针都没听说过,还写什么C++?
-----
网友解答:
-----
不行。举个例子,你不知道你传递出去的内存对方是否还在使用,这个时候你贸然回收,对对方来说就是一种灾难。
-----
网友解答:
-----
智能指针可以很大程度解决这个问题。 但需要考虑跨线程和进程的问题。
------------------
推荐阅读:
有人说热火三巨头都打不过的马刺,为何在15年季后赛被快船首轮淘汰了?
现在持有什么,资产才能最好的保值?该选择美元,人民币,还是贵金属?
上一篇:晨跑和夜跑究竟哪个好?
下一篇: 金陵十二钗正册都有谁?