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