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

C中的内存泄漏.编程风格

发布时间:2020-12-16 06:46:55 所属栏目:百科 来源:网络整理
导读:对于小程序,我们可以通过这种方式防止内存泄漏: proc() { //allocate memory for matrix try { } catch { //free matrix memory } ... //free matrix memory} 如果我们的程序更复杂: proc() { //allocate memory for matrix try { } catch { //free matrix
对于小程序,我们可以通过这种方式防止内存泄漏:

proc() {

  //allocate memory for matrix
  try {
  }
  catch {
    //free matrix memory
  }
    ...

  //free matrix memory
}

如果我们的程序更复杂:

proc() {

  //allocate memory for matrix
  try {
  }
  catch {
    //free matrix memory
  }
    ...

  try {
  }
  catch {
    //free matrix memory
  }
    ...

  try {
  }
  catch {

    //free matrix memory
  }
    ...

  //free matrix memory
}

它看起来有点笨拙.
是一种更好的方法,更好的编程风格是否存在内存泄漏控制?
据我所知,C有auto_ptr,我们可以开发程序而不需要关心内存释放.

proc() {

  //allocate auto_ptr
  try {
  }
  catch {

  }
    ...

}

但是,据我所知,auto_ptr甚至不适用于数组.因此,在一般情况下,这是不可接受的方式.

解决方法

auto_ptr不是一个独特的案例.这不是“auto_ptr或没有”. auto_ptr是一般编程习惯用法的一个例子,它处理资源分配/解除分配而没有泄漏.

这个成语叫做RAII.

这意味着资源应该映射到一个对象,该对象管理资源的生命周期,并确保在适当的时候清理它.

在auto_ptr的情况下,这只需要通过让类存储指向已分配内存的指针来完成,并且在该类的析构函数中,对指针调用delete.

您可以使用它们而不是auto_ptr对自己的RAII类执行相同的操作.
但是还有其他类型的智能指针,它们优于auto_ptr(事实上,在C 11中已弃用).

它们是shared_ptr(引用计数的智能指针,它在最后一个引用存在时删除对象),scoped_ptr(更安全,但有限,相当于auto_ptr,可以在C 03中实现),以及unique_ptr,C 11替换for auto_ptr,它解决了auto_ptr所遇到的问题. unique_ptr可以安全地用在数组和标准容器中.

所以你不应该使用auto_ptr,但你绝对应该使用其他类型的智能指针和RAII.

(编辑:李大同)

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

    推荐文章
      热点阅读