問題を次のコードに切り分けました。
#include <windows.h>
using namespace std;
const wchar_t* readLine(int posX, int posY, int len) {
wchar_t* wcharFromConsole = new wchar_t[len];
COORD pos = {posX,posY};
DWORD dwChars;
ReadConsoleOutputCharacterW(GetStdHandle(STD_OUTPUT_HANDLE),
wcharFromConsole, // Buffer where store symbols
len, // Read len chars
pos, // Read from row=8, column=6
&dwChars); // How many symbols stored
wcharFromConsole [dwChars] = L'\0'; // Terminate, so string functions can be used
return wcharFromConsole;
}
int main() {
for (int i = 0; i <= 63; i++) {
readLine(0,0,80);
}
system("pause");
}
問題は、ループが 63 回未満実行されている場合に機能し、コンソールからロードされた文字の長さが 80 未満の場合にも機能することです...ここで何が起こっているのかわかりません。明示的に閉じる必要があるリソースはありますか...しかし、関数が閉じると、そのすべてのリソースも閉じる必要があるのはなぜですか。しかし、ここで何が起こっているのかわかりません。コンパイルされたプログラムは (エラーなしで) 黙ってsystem()
機能する前に終了します。プロジェクトからコードの一部を削除したため、他のエラー コードがありました。プログラムが異常な方法で終了を要求したこともあれば、プログラムがハングしてキーボード入力の受け入れを停止したこともありました。
- 編集:
提案に従ってコードを更新しました:
#include <iostream>
#include <windows.h>
using namespace std;
const wchar_t* readLine(int posX, int posY, int len) {
wchar_t* wcharFromConsole = new wchar_t[len];
COORD pos = {posX,posY};
DWORD dwChars = 0;
if(!ReadConsoleOutputCharacterW(GetStdHandle(STD_OUTPUT_HANDLE),
wcharFromConsole, // Buffer where store symbols
len, // Read len chars
pos, // Read from row=8, column=6
&dwChars)) // How many symbols stored
{
cout << "ReadConsoleOutputCharacterW failed, code" << GetLastError() << endl;
}
wcharFromConsole [dwChars] = L'\0'; // Terminate, so string functions can be used
return wcharFromConsole;
}
int main() {
for (int i = 0; i <= 100; i++) {
cout << "loop count: " << i << endl;
readLine(0,0,80);
}
system("pause");
}
出力:
loop count: 0
loop count: 1
loop count: 2
loop count: 3
// [...]
loop count: 63
loop count: 64
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
(最初に切り取ったものでは、エラーはまったく発生しませんでした。)