【问题标题】:Problem while initializing attribute in constructor c++在构造函数c ++中初始化属性时出现问题
【发布时间】:2020-05-15 22:43:35
【问题描述】:

当我尝试调试时 出现错误: “最终 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" }; icompile 是一个有趣的巧合。它不会做你认为它会做的事情。您不能一次分配给整个数组,= {a,b,c} 语法仅在 初始化 它时才有效(并且maps 甚至不是数组)。您可能需要maps = new string[2] = {"foo", "bar"};,同样需要mhours_played。除非你是为了练习,否则你应该使用std::vector 而不是手动调用newdelete
  • 这在构造函数之外工作吗?

标签: c++ class definition construct ctor-initializer


【解决方案1】:

这些陈述

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

【讨论】:

    【解决方案2】:

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

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

    这告诉操作系统,“嘿!我想要一些内存用于数组,我可以要一些吗?”并且操作系统(希望)说“是的,你去玩吧。”

    目前,您的代码尝试访问未分配内存中的第二个索引,而操作系统真的不喜欢这样。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-25
      • 2015-09-11
      • 2023-02-02
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      相关资源
      最近更新 更多