c++ std::cout未打印

0kjbasz6  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(377)

当我使用std::cout打印输出时,它不会向终端打印任何内容:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

std::string multiplystr(std::string string, int mult) {
    for (int i = 1; i < mult; i++)     {
        string = string + string;
    }
    return string;
}

class entry {
public:

    entry(int width) {
        int frameWidth = width;
    }

    int frameWidth;
    std::string framechar = "-";

    std::string frame = multiplystr(framechar, (frameWidth + 4));
    std::string justout = frame + '\n';
};

int main() {
    entry x1(15);
    std::string out1 = x1.frame;
    std::cout.flush();
    cout << "out1" << std::endl;
}

但是,如果我删除了print语句以外的所有内容,它就能正常打印,你知道它为什么这样做吗?
我也用过std::flush,也不管用。

s5a0g9ez

s5a0g9ez1#

你的代码有未定义的行为,所以字面上 * 任何事情 * 都可能发生1。
entry类中,构造函数体将其输入width值赋给一个名为frameWidth的 * 局部变量 *,该变量 * 隐藏 * 了同名的类成员,因此frameWidth成员从未初始化。
然后,在初始化frame成员时,将frameWidth成员传递给multiplystr()mult参数。frame成员是在构造函数体开始运行 * 之前 * 初始化的,因此,即使您修复了构造函数体以去除局部变量并正确地将width值赋给frameWidth成员,到那时已经太晚了,损害已经造成。
1:在我的测试中,当我运行代码时,在到达print语句之前,我得到了一个运行时错误,因为mult最终是一个非常大的值,导致循环耗尽可用内存。
要解决这个问题,你需要在构造函数的initialization list中初始化frameWidth成员,而不是在构造函数体中。初始化列表将在frame成员被初始化之前初始化frameWidth,也就是在multiplystr()被调用之前。
试试这个:

#include <iostream>
#include <vector>
#include <string>

std::string multiplystr(std::string s, int mult) {
    for (int i = 1; i < mult; i++)     {
        s += s;
    }
    return s;
}

class entry {
public:

    entry(int width) : frameWidth(width) {}

    int frameWidth;
    std::string framechar = "-";

    std::string frame = multiplystr(framechar, (frameWidth + 4));
    std::string justout = frame + '\n';
};

int main() {
    entry x1(15);
    std::string out1 = x1.frame;
    std::cout << "out1 = " << out1 << std::endl;
}

Online Demo

相关问题