gpt4 book ai didi

c++ - 函数超出堆栈大小,考虑将一些数据移动到堆中 (C6262)

转载 作者:行者123 更新时间:2023-11-30 02:14:06 25 4
gpt4 key购买 nike

我正在尝试通过制作密码生成器来学习 C++,当我快完成时,我收到警告(警告 C6262 函数使用“20044”字节的堆栈:超过/analyze:stacksize“16384”。考虑移动一些数据堆。)由于我是 C++ 的初学者,现在只是基础知识,所以我不知道该怎么做。

因为我在函数中有 2 个数组,我试图将它们移出 main 函数,它确实降低了它使用的字节数 (20100),但它仍然太高了。我试图阅读 Microsoft 的错误指南,但我不知道堆或将所述数据移动到 C++ 中的堆

代码如下:

#include <iostream>
#include <random>
using namespace std;

class Randomer {
// random seed by default
std::mt19937 gen_;
std::uniform_int_distribution<size_t> dist_;

public:
/* ... some convenient ctors ... */

Randomer(size_t min, size_t max, unsigned int seed = std::random_device{}())
: gen_{ seed }, dist_{ min, max } {
}

// if you want predictable numbers
void SetSeed(unsigned int seed) {
gen_.seed(seed);
}

size_t operator()() {
return dist_(gen_);
}
};

string alphabet{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n','o','p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z' };
string specialchars{ ' ','!','#','$', '%', '&','(',')','*','+','-','.','/',':',';','<','=','>','?','@' };
Randomer rand1{ 0,2 };
Randomer randint{ 0,9 };
Randomer randalpha{ 0,26 };
Randomer randspecial{ 0,20 };
int main()
{
while (true) { //This loop is to restart the program if an invaild response is detected.
int i;
int lengthofpassword = 8;

cout << "Do you want to generate a password or to type in a existing password to make it stronger?\n\n(1 for generation, 2 for existing password)\n";
cin >> i;
int g = 0;
if (i == 1) {
cout << "\nWhat is the length of the password?\n";
cin >> lengthofpassword;
while (g <= lengthofpassword -1) {

//if (rand() == 0) {//numb
// cout << randint();
//}
//else if (rand() == 1) {//letter
// cout << alphabet[randalpha()];
//}
switch (rand1())
{
case 0:
cout << alphabet[randalpha()];
break;
case 1:
cout << randint();
break;
case 2:
cout << specialchars[randspecial()];
break;
default:
break;
}

g = g + 1;
//cout << "\n\n" << g << "\n\n";
}
cout << "\n";
system("pause");
return 0;

}
else if (i == 2) {
cout << "\n";
system("pause");
return 0;
}
else {
cout << "\n";
cout << "Invaild Response!\n";
}
}
// system("pause");
return 0;
}

尝试为 stackoverflow 压缩它没有用。虽然它还没有坏,并且按预期工作,但我觉得我应该现在而不是以后学习这种东西。

最佳答案

将一些东西从堆栈移动到堆基本上是使用 new 显式分配新对象,而不是声明变量。

在您的情况下,您可以将四个 Randomer xxx 变量替换为 Randomer* xxx = new Randomer{...},并在循环结束时将其删除。尽管在循环内重新创建 PRNG 没有多大意义,也许您应该将 Randomer 对象移到 main() 之外。

关于c++ - 函数超出堆栈大小,考虑将一些数据移动到堆中 (C6262),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58477291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com