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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:16:18