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
當我在'return'之前加上'delete [] wcharFromConsole;'時,循環運行時間更長,結束於0x2BBF,也沒有錯誤。我不明白你的意思是'死指針',我更新了我的問題中的代碼。 – rsk82 2012-07-23 06:53:25
'ws.c_str()'返回的指針只有在'ws'既沒有改變也沒有被破壞時纔有效。由於'ws'是一個局部變量,因此從函數返回時將會被銷燬,從而導致'ws.c_str()'返回的指針無效。 – RedX 2012-07-23 07:03:22
是的,但我更新了代碼,現在先創建const wchar,然後賦值,然後返回。直到現在,我還使用這種直接從字符串直接返回char []的方式。 – rsk82 2012-07-23 07:22:28