所以我决定将一个控制台类作为std::cout << stream << std::endl
例程的替代。
这是我的代码:
class Console {
public:
Console() {
this->console = GetStdHandle(STD_OUTPUT_HANDLE);
this->current_color = 7;
}
void color(int k) {
this->current_color = k;
SetConsoleTextAttribute(this->console, this->current_color);
}
void remove() {
FreeConsole();
}
void print(std::string s) {
std::cout << s;
}
void log(std::string s) {
this->color(7);
std::cout << s << std::endl;
this->color(this->current_color);
}
void error(std::string s) {
this->color(12);
std::cout << s << std::endl;
this->color(this->current_color);
}
private:
HANDLE console;
int current_color;
};
将控制台初始化为Console console;
,我使用console.log("String " + n)
,其中n是无符号短整数。代码编译得很好,但是这个东西出现了:
它是什么,我该如何解决?
答案 0 :(得分:2)
您的程序包含未定义的行为。
id
(其中addStudent()
是一个整数类型)解释如下:
console.log("String " + n)
如果n
或const char* tmp_ptr1 = "String ";
const char* tmp_ptr2 = tmp_ptr1 + n;
console.log(std::string(tmp_ptr2));
上述代码执行越界访问。在您的情况下,这种访问恰好从链接到程序数据部分的字符串文字中获取一些其他(子)字符串,并在屏幕上看到它。从理论上讲,其他任何事情都可能发生。