如何使用new创建Fish类指针的动态数组?
动态创建Fish指针数组的正确实现
你的现有Pool类代码存在类型不匹配的问题:成员变量fishes是Fish**类型,但new Fish[p_fishes]返回的是Fish*(指向Fish对象数组的指针),这和你想要的「Fish指针数组」不是一回事。以下是用new实现的正确方案:
修正后的Pool类代码
#include <iostream> class Fish { public: void Swim() { std::cout << "I'm Swimming" << std::endl; } }; class Pool { Fish** fishes; int fishCount; // 记录指针数组的元素数量,用于析构和操作 public: Pool(int p_fishes) : fishCount(p_fishes) { // 分配能容纳p_fishes个Fish*的数组,返回Fish**类型 fishes = new Fish*[p_fishes]; // 逐个初始化每个指针,指向新创建的Fish对象 for (int i = 0; i < p_fishes; ++i) { fishes[i] = new Fish(); } } ~Pool() { // 第一步:释放每个Fish对象的内存 for (int i = 0; i < fishCount; ++i) { delete fishes[i]; } // 第二步:释放指针数组本身的内存 delete[] fishes; } // 示例方法:让池子里所有鱼游泳 void LetAllSwim() { for (int i = 0; i < fishCount; ++i) { fishes[i]->Swim(); } } };
关键说明
- 指针数组的分配:
new Fish*[p_fishes]是创建一个存储Fish*的数组,返回值类型为Fish**,和你的成员变量类型匹配,这才是你需要的「Fish指针数组」。 - 内存释放顺序:析构时必须先逐个释放每个
Fish对象(delete fishes[i]),再释放指针数组本身(delete[] fishes),否则会造成内存泄漏。 - 记录元素数量:新增
fishCount成员变量是为了在析构、遍历操作时知道数组的长度,避免越界。
更安全的替代方案(可选)
如果不想手动管理内存,推荐使用C++标准库的容器和智能指针,避免内存泄漏风险:
#include <vector> #include <memory> class Fish { public: void Swim() { std::cout << "I'm Swimming" << std::endl; } }; class Pool { std::vector<std::unique_ptr<Fish>> fishes; public: Pool(int p_fishes) { fishes.reserve(p_fishes); for (int i = 0; i < p_fishes; ++i) { fishes.emplace_back(std::make_unique<Fish>()); } } void LetAllSwim() { for (auto& fish : fishes) { fish->Swim(); } } // 无需手动编写析构函数,vector和unique_ptr会自动处理内存释放 };
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

