2017-06-13 56 views
-1

我試圖通過使用GetTempPathA function來獲取Windows上用戶的臨時文件夾。GetTempPathA函數在打印結果後崩潰

LPSTR ptcPath = new CHAR(MAX_PATH); 

    GetTempPathA(MAX_PATH - 1, ptcPath); 

    std::cout << "Temporary path : " << ptcPath << std::endl; 

所以程序正確輸出的臨時路徑但(它的一個大的部分代碼)後立即崩潰。

我確定崩潰來自GetTempPathA,因爲如果我評論該行,該程序可以正常工作。

無論我分配或放置的尺寸是多少,都會崩潰,而不是MAX_PATH - 1,除了打印亂碼的<size of the path> + 1下的所有值。

我把MAX_PATH - 1作爲一個值,因爲它解決了Google Groups上其他人的問題。

+1

你爲什麼要用'new'打擾? 'CHAR path [MAX_PATH];' –

+1

@ ndn:雖然解決了這個問題,但它的出現與第一個答案相同:'[]'而不是'()'。 – MSalters

+0

@ MSalters「這個問題是由...簡單的印刷錯誤引起的[...]「 –

回答

5

隨着

new CHAR(MAX_PATH) 

你的CHAR分配空間和初始化一個MAX_PATH。這意味着您致電GetTempPathA將寫出該單個CHAR元素的界限,導致未定義的行爲

你大概的意思

new CHAR[MAX_PATH] 

其分配MAX_PATH元素的數組。

+0

...好吧,我現在覺得自己很愚蠢。 – sh5164

+0

我會在11分鐘內接受你的回答。 – sh5164

+1

當然'MAX_PATH'是260,所以它甚至不會適合單個'char'(在Windows上) – MSalters

1

哇,我們應該從哪裏開始?

主要問題是表達

new CHAR(MAX_PATH); 

這樣做分配字符數組,但只有一個,單數字符與值的MAX_PATH

所以從某種意義上講,它好像你寫下來

char* c = new char(static_cast<char>(MAX_PATH)) 

而是簡單地使用std::string必須保持其內部緩衝區連續的事實:

std::string buffer; 
buffer.resize(MAX_PATH + 1); 
const auto new_size = GetTempPathA(buffer.size(), &buffer[0]); //deal with newsize == 0 
buffer.resize(new_size); 

無論如何,值得一提的是,在現代C++中不再使用new,new[],delete,delete[]。對於IO操作選擇std::vectorstd::string原始內存,對於其餘所有選擇std::unique_ptr/std::shared_ptr

+0

不妨將'buffer'初始化爲合適的大小。 – MSalters