调试断言因通过用户输入初始化类的数组而失败

Debug assertion fail from initializing an array of a class by user input

本文关键字:数组 失败 初始化 输入 断言 用户 调试      更新时间:2023-10-16

我有一个调试断言,运行Dinner.Init(Baskets,Bags);时失败

错误消息是矢量下标超出范围。

我认为这与可变大小数组的初始化有关。在步骤Dinner(int num): Apple(num){ }上需要异常长的时间。

错误消息和延迟是否相关?两者都有解决方案吗?

在福·

#include <vector>
extern int num1
extern int num2
#define Baskets = num1+num2
#define Bags = num1*2
struct  AppleStruct
{
    std::vector<int> Chunks;
    AppleStruct(){}
    AppleStruct(int num):Chunks(num){ }
};
Class Dinner
{
  std::vector<AppleStruct> Apple;
  public:
  Dinner(){}
  Dinner(int num): Apple(num){ }
  void Init(int num1, int num2);
}
void Dinner::Init(int num1, int num2)
{
int i, j;
    for (i=0; i<num1; i++)          // Fill everything INVALIDs
    {
        for (j=0; j<num2; j++)
        {
            Apple[i].Chunks[j]=1;
        }
    }
}

在福.cpp

#include "foo.h"
int num1;
int num2;
int main(int argc, char *argv[])
{
    sscanf_s(argv[1],"%d",&num1);
    sscanf_s(argv[2],"%d",&num2);
    AppleStruct(Bags);
    Dinner(Baskets);
    Dinner.Init(Baskets,Bags);
    return 0;
}

在 for 循环中,您正在为向量chunk赋值,但您尚未为结构分配空间来容纳块向量。

 for (i=0; i<num1; i++)          // Fill everything INVALIDs
{
    struct AppleStruct newstruct;
    for (j=0; j<num2; j++)
    {
        newstruct.Chunks.push_back(1);
    }
    Apple.push_back(newstruct);
}

Vector 不是一个常规数组,你应该先push_back添加元素。 改变:

Apple[i].Chunks[j] = 1; 

Apple[i].Chunks[j].push_back(1);

此外,您还需要向Apple添加元素。