template <class E>
bool ArrayList<E>::add(E* obj){
if(this->insure_capacity()){
this->_size++;
// cout<<"add ArrayList "<<_size<<endl;
this->_array[this->_size] = *obj;
return true;
}
return false;
}
template <class E>
bool ArrayList<E>::insure_capacity(){
if(_size < _capacity){
return true;
}else{
return grow();
}
};
template <class E>
bool ArrayList<E>::grow(){
cout<<"grow"<<endl;
int old_capacity = this->_capacity;
if(this->_capacity == 1){
this->_capacity == _DEFAULT_CAPACITY;
}else{
this->_capacity += old_capacity/2;
}
E* temp_array = new E[this->_capacity];//this line gives error
for(int i = 0 ; i < this->_capacity ; i++){
temp_array[i] = i < old_capacity ? _array[i]:0;
}
return true;
};
在上面的函数中当我初始化temp_array时,它会给出以下错误
malloc.c:2373:sysmalloc:断言`(old_top ==(((mbinptr)(((char *)&amp;((av) - &gt; bins [((1) - 1)* 2])) - __builtin_offsetof(struct malloc_chunk,fd))))&amp;&amp; old_size == 0)|| ((unsigned long)(old_size)
=(unsigned long)(((__ builtin_offsetof(struct malloc_chunk,fd_nextsize))+((2 *(sizeof(size_t))) - 1))&amp;〜((2 *(sizeof(size_t))) - 1)))&amp;&amp; ((old_top) - &gt; size&amp; 0x1)&amp;&amp; ((unsigned long)old_end&amp; pagemask)== 0)&#39;失败。
但是当我在类的构造函数中粘贴相同的行时。它成功执行。
我不知道为什么会出现这种错误。我已经搜索过了,但没有得到任何满意的答案。有人可以详细解释为什么会出现此错误以及如何解决它。 谢谢。
答案 0 :(得分:0)
OK!所以最后我得到了这个问题的答案。
实际问题出现在我的添加功能中,我将一个对象添加到Array-List。在List中添加一个对象之前我将_size变量递增1.因此第一个对象被添加到索引1,最后一个对象被添加到_array [_capacity](比如说初始容量是10,初始数组大小,那么我的最后一个元素是在第10个位置添加的,它超出了数组的范围。)
以下是产生错误的步骤。
1-我在构造函数中初始化了_array,其大小为10,即通过new运算符为数组的_DEFAULT_CAPACITY。 让我们假设数组的起始地址是1000,每个元素的地址是4字节; 因此阵列将占用40个字节的存储器,并且它将在位置1040处结束。
2-然后我向该数组添加了10个元素,但正如我上面讨论的那样,我的最后一个元素是在_array [10]中添加的(在C ++中它不会抛出ArrayOutOfBoundException); 由于这个原因,_array [10]元素的起始位置现在是1040。
3-当我向数组添加第11个元素时,我必须增加_array的大小,所以我创建了一个更大的temp_array并且它会抛出错误。 但实际问题从这里开始。
temp_array在_array地址的地址之后初始化。 因为C ++编译器将下一个变量初始化为malloc函数返回的前一个地址。(这里前面的位置将是(1040 + someset),因为_array在这里结束)但是这个地址已被_array的第11个元素占用,即_array [10] ]这是1040。 所以存在冲突,它会抛出断言错误。
我通过valgrind工具分析这个问题。 可在http://valgrind.org/此位置找到此工具。
详细解答由Jon Gjengset提供。谢谢他。
https://stackoverflow.com/a/19365957/5519615
关于valgrind的使用和内存问题的另一个好答案由Peri461提供