"使用适当的位掩码"而使用替代cout

时间:2016-11-19 12:24:17

标签: c++

所以我决定将一个控制台类作为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是无符号短整数。代码编译得很好,但是这个东西出现了: enter image description here 它是什么,我该如何解决?

1 个答案:

答案 0 :(得分:2)

您的程序包含未定义的行为。

id(其中addStudent()是一个整数类型)解释如下:

console.log("String " + n)

如果nconst char* tmp_ptr1 = "String "; const char* tmp_ptr2 = tmp_ptr1 + n; console.log(std::string(tmp_ptr2)); 上述代码执行越界访问。在您的情况下,这种访问恰好从链接到程序数据部分的字符串文字中获取一些其他(子)字符串,并在屏幕上看到它。从理论上讲,其他任何事情都可能发生。