多次调用函数会导致程序退出,并出现一个神秘的错误

function called multiple times causes program to exit with enigmatic error

本文关键字:一个 错误 函数 调用 退出 程序      更新时间:2023-10-16

我将问题隔离为以下代码:

#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''; // 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''; // 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.

(第一次剪切根本没有产生任何错误。)

这可能只是"一个接一个"。你在为"Len"字符分配空间,你在读"Len"字符,但你在末尾加了一个\0。

把你的新衣服换成Len+1,你可能会没事的。

dwChars应作为dwChars -1传递给ReadConsoleOutputCharacterW。您正在覆盖数组的末尾。

相关文章: