C++如何编译未知类型的静态数组?自定义my_array类问题求助
问题分析与解决方案
你的代码存在几个关键问题,导致无法正常工作:
- 构造函数中声明的
T data[N]是局部变量,和类的私有成员T* data没有关联,私有指针始终是未初始化的野指针。 - 析构函数中对未初始化的指针调用
delete[]会触发未定义行为。 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
相关产品推荐
相关产品推荐

