初始化构造函数c ++中的属性时遇到的问题

问题描述 投票:1回答:2

虽然我尝试调试出现错误:“ 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; }
};
c++ class definition construct ctor-initializer
2个回答
0
投票

这些陈述

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;
}

0
投票

似乎关键的误解是堆栈和堆分配之间的区别。如果我们通常在函数中为数组分配空间,您的代码将(几乎)正确:

#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不喜欢这样。

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

© www.soinside.com 2019 - 2024. All rights reserved.