2017-08-24 22 views
0

這可能是一個noob問題,但我甚至不知道該怎麼去google。當函數耗盡時,struct被歸零了?

我試圖實現一個fuse文件系統,並且在傳遞結構時遇到了問題,可能是因爲我對C++沒有經驗。

static int getStat(std::string path, struct stat *stout) 
{ 
    ... 
    struct stat *st = new struct stat(); 
    lstat(path.c_str(), st); 
    // lstat correctly filled st according to gdb 
    ... 
    stout = st; 
    // values are correctly copied to stout according to gdb 
} 

void something() 
{ 
    struct stat *st = new struct stat(); // this might also be stack allocated by fuse, idk 
    getStat("/", st); 
    // but st is all zero now !? 
} 

我錯過了什麼?我如何正確地將數據從功能中取出?

+0

不確定你是否忽略了它,但請注意'getStat'必須返回一個值,否則你有UB。 – NathanOliver

+0

如果在分配和重新分配給「stout」之前沒有「刪除」結構,那麼存在潛在的內存泄漏。 –

+0

不要在堆上分配統計信息(不要新建)!在堆棧上分配並將地址傳遞給lstat。 – 2017-08-24 15:40:09

回答

3

您必須傳遞一個雙指針才能夠在調用函數中反映已更改的指針。

所以這是解決

static int getStat(std::string path, struct stat **stout) 
... 
getStat("/", &st); 

,函數參數總是按值傳遞(除引用)。這意味着在函數getStat()中,stout是在函數調用中傳遞的指向struct的指針的副本。

所以,當新的地址是在函數裏分配給stout,這對原來的指針沒有影響到something()結構(自內getStat()stout只是內main()st複印件)。

由於我們在您可以使用@SomeProgrammerDude建議的引用。

static int getStat(std::string path, struct stat& stout) 
struct stat st; 
getStat("/", st); 
+1

爲什麼在C++編程時使用「雙指針」? C++有通過引用。 –

+0

它只是解釋問題。 –

+0

請注意,該問題被標記爲** C++ **而不是C.在C++中,您不需要在C中模擬傳遞引用,因爲C++具有本地引用。 –