使用unique ptr防檔案操作記憶體洩漏的小技巧

2021-10-07 13:43:11 字數 1304 閱讀 5050

假設從linux系統的某檔案讀取5個字元,可寫成:

#include

// ::open()

#include

// ::close()

#include

intmain()

char str[6]

=;long nread =::

read

(fd, str,

sizeof

(str-1)

);// 讀5個字元+'/0'

if(nread <0)

printf

("str = %s\n"

, str)

;// we can do something here::

close

(fd)

;}

但是這個程式存在潛在的記憶體洩漏,位置在:

printf

("str = %s\n"

, str)

;// we can do something here

如果此時printf丟擲異常或do something導致程式提前返回,則無法執行::close(fd)。那麼檔案描述符就沒有被正確關閉。

解決方案是使用智慧型指標來管理物件的作用域,但fd是整數,而非指標,怎麼使用智慧型指標呢?於是有如下技巧:

#include

// ::open()

#include

// ::close()

#include

#include

intmain()

// 使用unique_ptr管理記憶體分配物件的作用域

// 這時候我們就可以把程式中其他的::close語句刪除了

::std:

:unique_ptr<

int,

void(*

)(int*

)>

guard

(&fd,

(int

*p))

;char str[6]

=;long nread =::

read

(fd, str,

sizeof

(str-1)

);// 讀5個字元+'/0'

if(nread <0)

printf

("str = %s\n"

, str)

;// we can do something here

}

即保證了記憶體安全,又不用到處寫::close語句,是不是很香?

unique ptr使用總結

includestd unique ptrpname auto pname std make unique hello c 14 support make unique可以用乙個unique ptr初始化另外乙個unique ptr嗎?不可以,但是可以進行所有權轉移 vector可以裝unique ...

unique ptr的相關使用

unique ptr由c 11中引入,用於替代不安全的auto ptr。unique ptr是一種定義在 memory 中的只能指標。它持有對物件的獨有權 這意味著,記憶體資源所有權可以轉移到另外乙個unique ptr,並且原始的unique ptr不再擁有次資源。實際使用中,建議將物件限制為由乙...

unique ptr的使用和陷阱

與shared ptr不同,unique ptr沒有定義類似make shared的操作,因此只可以使用new來分配記憶體,並且由於unique ptr不可拷貝和賦值,初始化unique ptr必須使用直接初始化的方式。unique ptr up1 new int okay,直接初始化 unique...