虽然我尝试调试出现错误:“ Final project.exe中0x5784F2F6(ucrtbased.dll)的未处理异常:无效参数传递给认为无效参数致命的函数。”尝试过所有事情都无法解决该问题。
using namespace std;
class Map :
{
private:
double *mhours_played;
string *maps;
unsigned element_num;
public:
Map()
{
maps[2] = { "Summoner's rift", "Aram" };
element_num = 2; mhours_played[2] = {};
}
~Map() { delete[] maps; }
};
这些陈述
maps[2] = { "Summoner's rift", "Aram" };
mhours_played[2] = {};
没有道理。 map和mhours_played
是在构造函数主体内具有不确定值的指针。它们不是您认为的数组。例如,表达式maps[2]
是std :: string类型的标量对象。
至少至少定义构造函数
Map() : mhours_played( new double[2]() ),
maps( new std::string[2] { "Summoner's rift", "Aram" } ),
element_num( 2 )
{
}
和类似析构函数的
~Map()
{
delete[] maps;
delete[] mhours_played;
}
似乎关键的误解是堆栈和堆分配之间的区别。如果我们通常在函数中为数组分配空间,您的代码将(几乎)正确:
#include <string>
int main() {
std::string maps[2] = {"Chad", "Zimbabwe"};
}
这是完全有效的,并且可以正常工作。但是,您想要做的是为内存位置maps
中的字符串数组动态分配空间。此语法如下:
#include <string>
int main() {
std::string* maps;
maps = new std::string[2];
// ... more code ...
// always free your memory!
delete[] maps;
}
这告诉操作系统,“嘿!我想要一个数组的内存,我可以有吗?”操作系统(希望)说:“是的,这里很有趣。”
当前,您的代码尝试访问未分配内存中的第二个索引,并且操作系统really不喜欢这样。
我希望这会有所帮助,如果需要进一步说明,请告诉我。