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

如何在C++中实现可变长度的类指针动态数组?

可变长度类指针动态数组的实现方案

你的问题核心是未先为指针数组本身分配有效内存:A** classes_a = nullptr;仅声明了一个指向指针的指针,但它没有指向任何可访问的内存空间,直接访问classes_a[i]会触发未定义行为。下面提供两种可靠的实现方式:

方法一:手动管理原生动态内存

需要先分配存储指针的数组,再逐个创建A对象,同时必须在析构时释放所有资源避免内存泄漏,还要遵循三法则处理拷贝逻辑:

class A {
};

class B {
private:
    A** classes_a = nullptr;
    size_t arr_length; // 记录数组长度
public:
    // 构造函数,支持传入自定义长度
    B(size_t length) : arr_length(length) {
        // 第一步:分配存储A指针的数组内存
        classes_a = new A*[arr_length];
        // 第二步:逐个创建A对象
        for (size_t i = 0; i < arr_length; ++i) {
            classes_a[i] = new A();
        }
    }

    // 析构函数,按顺序释放资源
    ~B() {
        // 先释放每个A对象
        for (size_t i = 0; i < arr_length; ++i) {
            delete classes_a[i];
        }
        // 再释放指针数组本身
        delete[] classes_a;
        classes_a = nullptr;
    }

    // 拷贝构造函数(深拷贝,避免浅拷贝导致的重复释放)
    B(const B& other) : arr_length(other.arr_length) {
        classes_a = new A*[arr_length];
        for (size_t i = 0; i < arr_length; ++i) {
            classes_a[i] = new A(*other.classes_a[i]); // 依赖A的拷贝构造函数
        }
    }

    // 赋值运算符重载
    B& operator=(const B& other) {
        if (this != &other) {
            // 先释放当前对象的资源
            for (size_t i = 0; i < arr_length; ++i) {
                delete classes_a[i];
            }
            delete[] classes_a;

            // 拷贝新对象的资源
            arr_length = other.arr_length;
            classes_a = new A*[arr_length];
            for (size_t i = 0; i < arr_length; ++i) {
                classes_a[i] = new A(*other.classes_a[i]);
            }
        }
        return *this;
    }
};

使用示例:

B b1(8);  // 创建包含8个A对象的数组
B b2(12); // 创建包含12个A对象的数组

方法二:使用std::vector+智能指针(推荐)

借助C++标准库容器可以自动管理内存,结合智能指针能彻底避免手动释放的繁琐和内存泄漏风险:

#include <vector>
#include <memory>

class A {
};

class B {
private:
    std::vector<std::unique_ptr<A>> classes_a;
public:
    // 构造函数,传入自定义长度
    B(size_t length) {
        for (size_t i = 0; i < length; ++i) {
            // 直接创建并插入智能指针包裹的A对象
            classes_a.emplace_back(std::make_unique<A>());
        }
    }

    // 无需手动编写析构函数,std::unique_ptr和std::vector会自动释放所有资源
};

这种方式无需关注内存释放、拷贝逻辑等细节,是C++中最安全简洁的实现方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:20:40