2012-07-22 26 views
0

編譯器:http://sourceforge.net/projects/mingwbuilds/files/wcslen默默地退出當由ReadConsoleOutputCharacterW返回字符串具有一些特定長度

#include <iostream> 
#include <string.h> 
#include <windows.h> 
using namespace std; 

    const wchar_t* readConsole(int chars_to_read) { 
    wchar_t* wcharFromConsole = new wchar_t[chars_to_read+1]; 
    COORD pos = {0,0}; 
    DWORD dwChars; 
    if (!ReadConsoleOutputCharacterW(
     GetStdHandle(STD_OUTPUT_HANDLE), 
     wcharFromConsole, // Buffer where store symbols 
     chars_to_read,  // number of chars to read 
     pos, // Read from row=8, column=6 
     &dwChars // How many symbols stored 
    )) 
    { 
     printf("ReadConsoleOutputCharacterW failed %d\n", GetLastError()); 
     abort(); 
    } 
    wcharFromConsole [dwChars] = L'\0'; // Terminate, so string functions can be used 
    wstring ws = wcharFromConsole; 
    return ws.c_str(); 
    } 

int main() { 
    for (int i = 1; i<=0x3000; i++) { 
    printf("wcslen: %X \n",wcslen(readConsole(i))); 
    } 
    system("pause"); 
} 

這個循環在0x1FF1結束,暫停不被調用。刪除wstring似乎可以解決這個問題。但我在這裏需要它來修剪空白等功能。這裏沒有多大關係,但爲什麼調用wstring會導致這個問題呢?程序只是退出,沒有錯誤信息。

更新代碼,現在循環退出在0x2BBF

​​3210

回答

2

哎喲。

wstring ws = wcharFromConsole; 
return ws.c_str(); 

基本上,你在這裏返回一個死指針。該字符串將在返回時被銷燬,因此到達調用者的指針將無效。

編輯:你也泄漏內存,因爲「新」永遠不會被刪除。但是這通常不會導致明顯的問題,只會增加程序的內存使用。

+0

當我在'return'之前加上'delete [] wcharFromConsole;'時,循環運行時間更長,結束於0x2BBF,也沒有錯誤。我不明白你的意思是'死指針',我更新了我的問題中的代碼。 – rsk82 2012-07-23 06:53:25

+0

'ws.c_str()'返回的指針只有在'ws'既沒有改變也沒有被破壞時纔有效。由於'ws'是一個局部變量,因此從函數返回時將會被銷燬,從而導致'ws.c_str()'返回的指針無效。 – RedX 2012-07-23 07:03:22

+0

是的,但我更新了代碼,現在先創建const wchar,然後賦值,然後返回。直到現在,我還使用這種直接從字符串直接返回char []的方式。 – rsk82 2012-07-23 07:22:28

相關問題