c++动态调整数组大小时内存分配出现分段错误



append(int val)函数运行时,我得到一个分段错误,并以多态方式调用,但我看不到memalloc错误来自何处。我仍然是c++的新手,经常遇到这个问题,但是当我自己修复它时,它总是偶然发生的。指针吗?(不是双关语,还是:))

IntegerCombination.h

#ifndef INTEGERCOMBINATION_H
#define INTEGERCOMBINATION_H

using namespace std;
class IntegerCombination
{
public:
IntegerCombination();
void append(int Val);
virtual int combine() = 0;
protected:
int* _collection;
int _length;
};
#endif

IntegerCombination.cpp

#include "IntegerCombination.h"
IntegerCombination::IntegerCombination()
{
_length = 0;
}
void IntegerCombination::append(int val)
{
int newValPos = _length;            // Stores current length as new position for new 
// value
int* temp = _collection;            //Stores current array
delete _collection;                 // Deletes current array
_length++;                          // Increases the length for the new array
_collection = new int[_length];     // Creates a new array with the new length
for(int i = 0; i < newValPos; i++)
{
_collection[i] = temp[i];       // Allocates values from old array into new array
}
_collection[newValPos] = val;       // Appends new value onto the end of the new array
}

Main.cpp


#include "IntegerCombination.h"
#include "ProductCombination.h"
using namespace std;
int main()
{
ProductCombination objProd;
for(int i = 1; i <= 10; i++)
{
objProd.append(i);
}
return 0;
}

注意:ProductCombination.h和ProductCombination.cpp中的代码并不完全相关,因为在.cpp文件中,append(int val)只是将追加调用委托给IntegerCombination.h

中的基类

对于初学者,构造函数不初始化数据成员_collection

IntegerCombination::IntegerCombination()
{
_length = 0;
}

因此,该数据成员可以具有不确定的值,并且对这样的指针使用delete操作符会调用未定义行为。

此外,当您试图分配数组时,您需要使用操作符delete []而不是delete

类必须至少显式定义一个虚析构函数。也可以将复制构造函数和复制赋值操作符声明为已删除,或者也显式定义它们。

函数append有几个错误。

如前所述,您需要在此语句 中使用delete []操作符
delete _collection;

代替操作符delete

但是这个操作符必须在分配新数组之后调用。否则指针temp将具有无效值

int* temp = _collection;            //Stores current array
delete [] _collection;                 // Deletes current array

也就是说,你需要在将前一个数组的元素复制到新分配的数组后删除它。

相关内容

  • 没有找到相关文章

最新更新