You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向类方法传递数组时遇unknown array size in delete错误求助

问题描述

将湖人阵容数组传入Team类构造函数时触发编译错误:

  • error: unknown array size in delete
  • 编译器附加提示:synthesized method 'Team::~Team()' first required here(指向创建lakers对象的代码行)
代码示例
#include <iostream>
#include <string>

using namespace std;

string lakersStartRoster[] = {"LeBron", "AD", "Austin", "Rui", "D'Angelo"};

class Team {
    public:
        string name;
        int wins, losses;
        string roster[]; // 问题根源
        Team(string x, int a, int b, string y[]){
            name = x;
            wins = a;
            losses = b;
            cout << y << endl;
        }
};

int main(){
    Team lakers("Los Angeles Lakers", 70, 12, lakersStartRoster);
    return 0;
}
错误信息
main.cpp:8:7: error: unknown array size in delete
        8 | class Team {
      |       ^~~~
    main.cpp: In function 'int main()':
    main.cpp:23:68: note: synthesized method 'Team::~Team()' first required here
       23 |         Team lakers("Los Angeles Lakers", 70, 12, lakersStartRoster);
          |
问题原因与解决方法

核心原因

C++不允许类成员使用变长数组(VLA),也就是string roster[];这种无长度声明的数组写法是非法的。编译器自动生成类的析构函数时,无法确定该数组的内存大小,因此抛出unknown array size in delete错误。

三种修正方案

1. 使用std::vector(推荐)

用标准容器替代原生数组,自动管理内存且支持动态扩容,是最省心的方案:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<string> lakersStartRoster = {"LeBron", "AD", "Austin", "Rui", "D'Angelo"};

class Team {
    public:
        string name;
        int wins, losses;
        vector<string> roster;
        
        // 用初始化列表简化赋值
        Team(string x, int a, int b, const vector<string>& y)
            : name(x), wins(a), losses(b), roster(y) {}
};

int main(){
    Team lakers("Los Angeles Lakers", 70, 12, lakersStartRoster);
    return 0;
}

2. 声明固定大小的数组

如果阵容长度固定不变,可以在类中明确指定数组大小:

#include <iostream>
#include <string>

using namespace std;

const int ROSTER_SIZE = 5;
string lakersStartRoster[ROSTER_SIZE] = {"LeBron", "AD", "Austin", "Rui", "D'Angelo"};

class Team {
    public:
        string name;
        int wins, losses;
        string roster[ROSTER_SIZE];
        
        Team(string x, int a, int b, const string y[ROSTER_SIZE]){
            name = x;
            wins = a;
            losses = b;
            // 手动拷贝数组内容
            for(int i = 0; i < ROSTER_SIZE; ++i){
                roster[i] = y[i];
            }
        }
};

int main(){
    Team lakers("Los Angeles Lakers", 70, 12, lakersStartRoster);
    return 0;
}

3. 动态分配数组(不推荐新手使用)

需要手动管理内存,必须实现析构函数、拷贝构造和赋值运算符(遵循Rule of Three),否则容易出现内存泄漏:

#include <iostream>
#include <string>

using namespace std;

string lakersStartRoster[] = {"LeBron", "AD", "Austin", "Rui", "D'Angelo"};
const int ROSTER_SIZE = sizeof(lakersStartRoster)/sizeof(lakersStartRoster[0]);

class Team {
    public:
        string name;
        int wins, losses;
        string* roster;
        int rosterSize;
        
        // 构造函数:动态分配内存
        Team(string x, int a, int b, const string y[], int size)
            : name(x), wins(a), losses(b), rosterSize(size) {
            roster = new string[size];
            for(int i = 0; i < size; ++i){
                roster[i] = y[i];
            }
        }
        
        // 析构函数:释放动态内存
        ~Team(){
            delete[] roster;
        }
        
        // 拷贝构造:避免浅拷贝
        Team(const Team& other){
            name = other.name;
            wins = other.wins;
            losses = other.losses;
            rosterSize = other.rosterSize;
            roster = new string[rosterSize];
            for(int i = 0; i < rosterSize; ++i){
                roster[i] = other.roster[i];
            }
        }
        
        // 赋值运算符:避免重复释放内存
        Team& operator=(const Team& other){
            if(this != &other){
                delete[] roster;
                rosterSize = other.rosterSize;
                roster = new string[rosterSize];
                for(int i = 0; i < rosterSize; ++i){
                    roster[i] = other.roster[i];
                }
                name = other.name;
                wins = other.wins;
                losses = other.losses;
            }
            return *this;
        }
};

int main(){
    Team lakers("Los Angeles Lakers", 70, 12, lakersStartRoster, ROSTER_SIZE);
    return 0;
}

内容的提问来源于stack exchange,提问作者GoofyGaff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:00:55