C++中动态初始化泛型数组时出现断言错误
修复你的ArrayList泛型数组断言错误
先直接点出你代码里最致命的问题——数组下标访问顺序颠倒,这几乎肯定是触发断言的核心原因:
在你的add方法里,你先执行了this->_size++,再用自增后的_size作为下标给数组赋值。但数组的索引是从0开始的:初始_size为0时,自增后变成1,你直接往_array[1]塞元素,跳过了第一个位置;当_size增长到等于_capacity时,你会访问_array[_capacity],这已经超出了数组的有效范围(数组有效索引是0到_capacity-1),debug模式下的断言机制就会触发错误。
第一步:修复add方法的下标逻辑
把赋值和自增的顺序调换过来,先把元素放到当前_size对应的空位置,再增加_size:
template <class E> bool ArrayList<E>::add(E* obj){ if(this->insure_capacity()){ // 先赋值到当前size的位置(数组的下一个空位置) this->_array[this->_size] = *obj; this->_size++; // cout<<"add ArrayList "<<_size<<endl; return true; } return false; }
第二步:补全正确的grow扩容逻辑
你贴的grow代码没写完,要是扩容逻辑有问题(比如没正确分配新内存、没拷贝旧元素、没释放旧内存),也会导致后续的内存访问错误,触发断言。这里给你一个标准的扩容实现:
template <class E> bool ArrayList<E>::grow(){ cout<<"grow"<<endl; int old_capacity = this->_capacity; // 扩容策略:初始容量设为10,之后每次翻倍 int new_capacity = old_capacity == 0 ? 10 : old_capacity * 2; // 用nothrow避免内存分配失败直接抛出异常 E* new_array = new(std::nothrow) E[new_capacity]; if(new_array == nullptr){ // 内存分配失败,返回false return false; } // 拷贝旧数组的所有元素到新数组 for(int i = 0; i < this->_size; i++){ new_array[i] = this->_array[i]; } // 释放旧数组的内存,避免内存泄漏 delete[] this->_array; // 更新数组指针和容量 this->_array = new_array; this->_capacity = new_capacity; return true; }
额外要检查的点
- 确保你的ArrayList构造函数正确初始化成员变量:
_array初始为nullptr,_size初始为0,_capacity初始为0或者默认值(比如10) - 如果你的泛型类型
E是自定义类,要确保它的拷贝构造函数和赋值运算符是正确实现的,避免浅拷贝导致的内存问题 - 断言错误大多和越界访问有关,修复完下标问题后,你可以在debug模式下再测试,看看断言是否消失
内容的提问来源于stack exchange,提问作者Navin Gupta
相关产品推荐
相关产品推荐

