2013-02-21 57 views
1

我需要一些幫助來計算內存分配錯誤。我不斷收到此錯誤:將字符串轉換爲char時的內存分配錯誤*

Error: Memory could not be allocated.

...當fList是在下面的代碼大:

for (unsigned int ii=0; ii<fList.size(); ii++) { 

    char *fName = new char[fList[ii].length() + 1]; 
    strcpy(fName, fList[ii].c_str()); 
    err = xInitFile(fName, ii+1); 
    if(err != 0) { 
     cout << "FOOBAR" << endl; 
    }    
    delete[] fName; 
} 

fListstd::vector<std::string>

功能xInitFile是C共享庫函數具有下列原型:

int xInitFile(char *fName, int fHandle) 

如果fList較小,則一切都正常運行。我很確定問題在於我如何將字符串轉換爲char *,但我無法弄清楚如何解決它。據我所知,fName總是被刪除,所以它似乎不是內存泄漏。我的內存使用量在運行代碼時也不會激增。

編輯:

註釋掉err = xInitFile(fName, ii+1);消除錯誤。這意味着分配錯誤發生在xInitFile,對吧?我之前並沒有想過這樣做,因爲我認爲問題出現在我的代碼中(我是新來的C++)。

+1

那麼,誰打印服務 '錯誤:內存不能分配'?它甚至與你的內存分配有關嗎?好像你在這裏展示不相關的代碼片段...... – 2013-02-21 16:04:25

+0

如果你在for循環中刪除了fName,那麼你使用它並立即丟棄它是不是更好?可能是因爲你沒有刪除,並且在每次迭代中你都會得到一個fName的新位置,導致內存佔用 – 2013-02-21 16:04:33

+0

用try/catch包裝'new'並打印一些東西。如果你看到你的消息,那麼這個錯誤是由'new'產生的,在另一種情況下是'xInitFile'產生的。 – borisbn 2013-02-21 16:04:50

回答

1

這可能是因爲某種原因而皺起眉頭,但我傾向於嘗試strdup

char *fName = strdup(fList[ii].c_str()); 

搭配

free(fName); 
+2

'strdup'唯一的缺點是它不是(C或C++)標準。這是Posix,你會用VC++得到一個警告(你可以使用'_strdup'代替它)。編寫自己的代碼非常簡單,但事實上,我會使用將C++字符串提取到'std :: vector '中的東西,並使用它。或者創建一個類來做到這一點:它只是幾行代碼,並且如果你頻繁地連接到遺留的C,它將'輸出到'char *',這是值得的。 (如果遺留的C沒有輸出,只需使用'std :: string :: c_str()'就足夠了。) – 2013-02-21 16:41:29

相關問題