2010-05-19 33 views
15

我需要一個跨平臺的方式來獲取當前的工作目錄(是的,getcwd做我想做的)。我想這可能做的伎倆:什麼是獲取當前目錄的跨平臺方式?

#ifdef _WIN32 
    #include <direct.h> 
    #define getcwd _getcwd // stupid MSFT "deprecation" warning 
#elif 
    #include <unistd.h> 
#endif 
#include <string> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    string s_cwd(getcwd(NULL,0)); 
    cout << "CWD is: " << s_cwd << endl; 
} 

我得到這個閱讀:

應該沒有內存泄漏,它應該在Mac上工作,對嗎?

UPDATE:我擔心的東西仍然是錯在這裏(我試圖避免產生與確定長度的字符數組,因爲有以獲取GETCWD一個體面的長度沒有正確的方法):

char* a_cwd = getcwd(NULL,0); 
string s_cwd(a_cwd); 
free(a_cwd); // or delete a_cwd? 

回答

12

你不能用NULL緩衝區調用getcwd。根據Opengroup

如果buf是空指針,getcwd()的行爲是未指定的。

此外,getcwd可以返回NULL,這可以破壞字符串構造函數。

你需要改變,要像:

char buffer[SIZE]; 
char *answer = getcwd(buffer, sizeof(buffer)); 
string s_cwd; 
if (answer) 
{ 
    s_cwd = answer; 
} 
+2

如果他只對Windows,Linux和Max OS X的兼容性感興趣,那麼'getcwd(NULL)'是明確定義的。它們都以同樣的方式擴展功能。 – 2010-05-19 19:35:54

+0

我接受了這個,但上面的評論是正確的。我的代碼確實有內存泄漏,所以需要解決 – rubenvb 2010-05-19 20:07:27

+0

@RobKennedy - 對於Linux,它取決於所針對的版本。例如,在RHEL5框中,'getcwd(NULL)'仍被記錄爲未定義。 – 2010-05-19 21:13:47

25

如果您沒有問題,請使用boost filesystem進行方便的跨平臺文件系統操作。

boost::filesystem::path full_path(boost::filesystem::current_path()); 

這裏是一個example

編輯:在評論中指出的投資回報率丹東,文件系統成爲ISO C++ in C++17的一部分,所以不需要再提升:

std::filesystem::current_path(); 
+0

應該提到:試圖限制外部依賴,所以沒有升壓請。 – rubenvb 2010-05-19 19:30:18

+4

啊,好的。我會留下這條評論,以防其他人偶然發現這個問題;) – catchmeifyoutry 2010-05-19 19:30:48

+2

從C++ 14/C++ 17開始,您可以使用'std :: filesystem :: current_path()':http:// en。 cppreference.com/w/cpp/filesystem/current_path – 2017-04-26 09:29:12

2

調用getcwd用NULL指針規定執行。它經常爲你使用malloc進行分配(在這種情況下你的代碼確實有內存泄漏)。但是,它不能保證一切工作。所以你應該分配你自己的緩衝區。

char *cwd_buffer = malloc(sizeof(char) * max_path_len); 
char *cwd_result = getcwd(cwd_buffer, max_path_len); 

打開組有一個示例顯示如何從_PC_PATH_MAX獲取最大路徑長度。你可以考慮在Windows上使用MAX_PATH。請參閱this question瞭解這兩個平臺上的該號碼。

+0

std :: string構造函數不會釋放malloc的內存嗎? – rubenvb 2010-05-19 19:48:50

+0

@rubenvb,不,它只是將字符串初始化爲一個副本。它無法知道如何分配'char *'傳遞。 – 2010-05-19 20:05:23

+0

Dang,好的,謝謝 – rubenvb 2010-05-19 20:06:20

相關問題