在构造函数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 确实 不喜欢那样。

希望这对您有所帮助,如果您需要进一步说明,请告诉我。