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

C++如何编译未知类型的静态数组?自定义my_array类问题求助

问题分析与解决方案

你的代码存在几个关键问题,导致无法正常工作:

  1. 构造函数中声明的T data[N]是局部变量,和类的私有成员T* data没有关联,私有指针始终是未初始化的野指针。
  2. 析构函数中对未初始化的指针调用delete[]会触发未定义行为。
  3. at函数的索引判断错误:数组索引范围是0到N-1,应该判断index >= N而非index > N。

下面给出两种符合需求的实现方式:

方式一:直接使用固定大小数组作为类成员(推荐)

这种方式不需要手动管理内存,编译器会自动处理构造和析构,效率更高,也更简洁:

template<typename T, std::size_t N>
class my_array {
public:
    const T& at(std::size_t index) const
    {
        if(index >= N) throw std::out_of_range("Index is wrong. Try again");
        return data[index];
    }
    
    // 其他成员函数...

    // 可选:自定义构造函数初始化元素(如果需要)
    my_array() 
    {
        // 默认初始化每个元素(适用于支持默认构造的T类型)
        for(std::size_t i = 0; i < N; ++i) {
            data[i] = T();
        }
    }

private:
    T data[N]; // 直接声明固定大小的数组成员
};

方式二:使用动态分配的数组(不推荐,仅作参考)

如果一定要用指针存储数组,需要通过new动态分配内存,同时必须遵循三法则(实现拷贝构造、拷贝赋值函数)避免浅拷贝问题:

template<typename T, std::size_t N>
class my_array {
public:
    const T& at(std::size_t index) const
    {
        if(index >= N) throw std::out_of_range("Index is wrong. Try again");
        return data[index];
    }
    
    // 其他成员函数...

    my_array() 
    {
        data = new T[N]; // 动态分配N个T类型元素
        // 初始化元素
        for(std::size_t i = 0; i < N; ++i) {
            data[i] = T();
        }
    }

    ~my_array()
    {
        delete[] data; // 释放动态分配的内存
    }

    // 拷贝构造函数
    my_array(const my_array& other) {
        data = new T[N];
        for(std::size_t i = 0; i < N; ++i) {
            data[i] = other.data[i];
        }
    }

    // 拷贝赋值运算符
    my_array& operator=(const my_array& other) {
        if(this != &other) {
            delete[] data;
            data = new T[N];
            for(std::size_t i = 0; i < N; ++i) {
                data[i] = other.data[i];
            }
        }
        return *this;
    }

private:
    T* data;
};

关键说明

  • 方式一的数组直接嵌入在类对象的内存中,不需要动态分配,避免了内存泄漏和野指针的风险。
  • 方式二需要手动管理内存,必须正确实现拷贝构造和拷贝赋值,否则会导致重复释放内存等问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:00:26