制作动态调整大小的数组 C++ 时内存分配中的分段错误
Segmentation fault in memory allocation when making a dynamically resized array 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)
只是将追加调用委托给基class 在 IntegerCombination.h
对于初学者来说,构造函数不会初始化数据成员_collection
IntegerCombination::IntegerCombination()
{
_length = 0;
}
所以这个数据成员可以有一个不确定的值,并且对这样的指针使用删除运算符会调用未定义的行为。
此外,当您尝试分配一个数组时,您需要使用运算符 delete []
而不是 delete
。
并且 class 必须至少显式定义一个虚拟析构函数。也可以将复制构造函数和复制赋值运算符声明为已删除,或者也明确定义它们。
函数 append
有几个错误。
如前所述,您需要在此语句中使用运算符 delete []
delete _collection;
而不是运算符 delete
.
但是这个运算符必须在分配新数组后调用。否则指针 temp
将具有无效值
int* temp = _collection; //Stores current array
delete [] _collection; // Deletes current array
也就是说,你需要在将它的元素复制到新分配的数组后删除以前的数组。
当 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)
只是将追加调用委托给基class 在 IntegerCombination.h
对于初学者来说,构造函数不会初始化数据成员_collection
IntegerCombination::IntegerCombination()
{
_length = 0;
}
所以这个数据成员可以有一个不确定的值,并且对这样的指针使用删除运算符会调用未定义的行为。
此外,当您尝试分配一个数组时,您需要使用运算符 delete []
而不是 delete
。
并且 class 必须至少显式定义一个虚拟析构函数。也可以将复制构造函数和复制赋值运算符声明为已删除,或者也明确定义它们。
函数 append
有几个错误。
如前所述,您需要在此语句中使用运算符 delete []
delete _collection;
而不是运算符 delete
.
但是这个运算符必须在分配新数组后调用。否则指针 temp
将具有无效值
int* temp = _collection; //Stores current array
delete [] _collection; // Deletes current array
也就是说,你需要在将它的元素复制到新分配的数组后删除以前的数组。