在构造函数c ++中初始化属性时出现问题
Problem while initializing attribute in constructor c++
当我尝试调试时
出现错误:
"Unhandled exception at 0x5784F2F6 (ucrtbased.dll) in Final project.exe: An invalid parameter was passed to a function that considers invalid parameters fatal."
什么都试过了也不知道怎么解决。
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] = {};
没有意义。 maps 和 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;
}
这里的关键误解似乎是堆栈和堆分配之间的区别。如果我们通常为函数中的数组分配 space,您的代码将(几乎)正确:
#include <string>
int main() {
std::string maps[2] = {"Chad", "Zimbabwe"};
}
这是完全有效的,并且按预期工作。但是,您要做的是为内存位置 maps
中的字符串数组动态分配 space。此语法如下:
#include <string>
int main() {
std::string* maps;
maps = new std::string[2];
// ... more code ...
// always free your memory!
delete[] maps;
}
这告诉 OS、"hey! I want some memory for an array, can I have some?" 和 OS(希望如此)说 "yeah, here you go have fun."
目前,您的代码试图访问未分配内存中的第二个索引,OS 确实 不喜欢那样。
希望这对您有所帮助,如果您需要进一步说明,请告诉我。
当我尝试调试时 出现错误: "Unhandled exception at 0x5784F2F6 (ucrtbased.dll) in Final project.exe: An invalid parameter was passed to a function that considers invalid parameters fatal." 什么都试过了也不知道怎么解决。
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] = {};
没有意义。 maps 和 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;
}
这里的关键误解似乎是堆栈和堆分配之间的区别。如果我们通常为函数中的数组分配 space,您的代码将(几乎)正确:
#include <string>
int main() {
std::string maps[2] = {"Chad", "Zimbabwe"};
}
这是完全有效的,并且按预期工作。但是,您要做的是为内存位置 maps
中的字符串数组动态分配 space。此语法如下:
#include <string>
int main() {
std::string* maps;
maps = new std::string[2];
// ... more code ...
// always free your memory!
delete[] maps;
}
这告诉 OS、"hey! I want some memory for an array, can I have some?" 和 OS(希望如此)说 "yeah, here you go have fun."
目前,您的代码试图访问未分配内存中的第二个索引,OS 确实 不喜欢那样。
希望这对您有所帮助,如果您需要进一步说明,请告诉我。