向类方法传递数组时遇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
相关产品推荐
相关产品推荐

