将数组复制到另一个动态数组的问题
Problems with copying an array into another dynamic array
我在执行该程序时遇到问题。我不知道为什么它如此突然地结束 运行 ("The program stopped working")。它的结果是我所希望的,不管它发生了什么。我尝试了很多方法来避免它,发现导致错误的是函数 void IntArr::addElement(int qtty,int *vec);
因为如果我删除它,程序会完美地完成并且没有任何错误。分析功能,对我来说很好,我不知道从我手中滑落的是什么。你应该做的功能是传递一个数组,其中包含我想要的元素数量,并将它们添加到另一个数组。
PS:原程序被文件分割的很好(class.h、class.cpp、main.cpp),无非是复制到这里不得不粘贴一切都在一起。
非常感谢你的帮助。问候!
#include <iostream>
using std::cout;
using std::endl;
#define PRESS_KEY std::cout<<"\nPresione Enter para continuar . . .\n";std::cin.get();
class IntArr{
private:
int * p;
int size;
int used;
//Verificador
void redimensionador(int cant);
public:
//Constructores
IntArr (int sz);
IntArr (int sz,int qtty,int *vec);
//Destructor
~IntArr();
//Visualizadores
void prtArr (void) const;
void prtArr (int cant);
//Accesores
int getSize(){return size;};
int getUsed(){return used;};
//Operaciones
void addElement(int xx);
void addElement(int qtty,int *vec);
};
//Constructores
IntArr::IntArr(int sz){
size = sz;
used = 0;
p = new int[size];
}
IntArr::IntArr(int sz,int qtty,int* vec){
if(qtty>sz){
sz = qtty;
}
size = sz;
used = qtty;
p = new int[size];
p = vec;
}
//Destructor
IntArr::~IntArr(){
delete []p;
}
//Visualizadores
void IntArr::prtArr(void) const{
if(used == 0){
cout<<endl<<"El array no tiene elementos."<<endl;
}
else{
cout<<endl<<"Array: ";
for(int i=0;i<used;i++){
cout<<p[i]<<", ";
}
cout<<endl;
}
}
void IntArr::prtArr(int cant){
if(used == 0){
cout<<endl<<"El array no tiene elementos."<<endl;
}
else{
cout<<endl<<"Array: ";
for(int i=0;i<cant;i++){
cout<<p[i]<<", ";
}
cout<<endl;
}
}
//Operaciones
double IntArr::getAvg(){
double acum = 0;
for(int i=0;i<used;i++){
acum += p[i];
}
return (acum/used);
}
void IntArr::addElement(int xx){
redimensionador(1);
p[used] = xx;
used++;
}
void IntArr::addElement(int qtty,int *vec){
int j=0;
redimensionador(qtty);
for(int i=used;i<(used+qtty);i++){
p[i] = vec[j];
j++;
}
used += qtty;
}
//Verificador
void IntArr::redimensionador(int cant){
if(cant+used>size){
if(cant > 5){
size += cant;
}
else{
size += 5 + cant;
}
}
}
int main(int argc, char *argv[]){
int v_aux[]= {0,5,10,15,20,25,30,35,40};
IntArr A(10,sizeof(v_aux)/sizeof(int),v_aux);
cout<<" size:"<<A.getSize()<<endl<<" used:"<<A.getUsed()<<endl;
A.prtArr();
A.addElement(77);
cout<<" size:"<<A.getSize()<<endl<<" used:"<<A.getUsed()<<endl;
A.prtArr();
A.addElement(11);
cout<<" size:"<<A.getSize()<<endl<<" used:"<<A.getUsed()<<endl;
A.prtArr();
A.addElement(8,v_aux);
cout<<" size:"<<A.getSize()<<endl<<" used:"<<A.getUsed()<<endl;
A.prtArr();
PRESS_KEY;
}
如果您 运行 内存不足,您不能仅仅通过与一个整数相加来表示您有更多的大小。您必须重新分配内存,将旧数组中的值复制到新数组中,然后删除旧数组。
这里也需要注意一下。原始指针很容易出错,我看到你这里有一些奇怪的结构。例如,IntArr::IntArr(int sz,int qtty,int* vec) 你分配了一个指针,然后立即覆盖它。该分配是一个泄漏。
确保正确更新大小和使用情况,以免忘记实际拥有多少内存。当大小发生变化时,您的缓冲区也必须发生变化,否则您将不同步。
我注意到的一个问题是以下几行:
p = new int[size];
p = vec;
当你这样做时:
- 你有内存泄漏。
new int[size]
返回的值在您的程序中丢失。
- 您将
p
指向 main
中静态定义的数组。当您在析构函数中使用 delete [] p;
时,这会导致未定义的行为。
我猜您想将值从 vec
复制到 p
。您必须将值一一复制。
手动编码的版本:
for (int i = 0; i < used; ++i )
{
p[i] = vec[i];
}
使用标准库函数std::copy
:
std::copy(vec, vec+used, p);
即使此构造函数也有内存泄漏并可能导致未定义的行为(例如,当 vec
指向局部数组的第一个元素时,或者当参数 vec
指向的数组将是已删除)。
IntArr::IntArr(int sz,int qtty,int* vec){
if(qtty>sz){
sz = qtty;
}
size = sz;
used = qtty;
p = new int[size];
p = vec;
}
首先分配一块内存,并将其地址分配给p
,然后重新分配p。
p = new int[size];
p = vec;
您必须将参数 vec
指向的数组中的元素复制到数据成员 p
指向的已分配内存中。
还有这个成员函数
void IntArr::redimensionador(int cant){
if(cant+used>size){
if(cant > 5){
size += cant;
}
else{
size += 5 + cant;
}
}
}
没有意义。您必须重新分配数据成员 p
.
指向的原始数组
我在执行该程序时遇到问题。我不知道为什么它如此突然地结束 运行 ("The program stopped working")。它的结果是我所希望的,不管它发生了什么。我尝试了很多方法来避免它,发现导致错误的是函数 void IntArr::addElement(int qtty,int *vec);
因为如果我删除它,程序会完美地完成并且没有任何错误。分析功能,对我来说很好,我不知道从我手中滑落的是什么。你应该做的功能是传递一个数组,其中包含我想要的元素数量,并将它们添加到另一个数组。
PS:原程序被文件分割的很好(class.h、class.cpp、main.cpp),无非是复制到这里不得不粘贴一切都在一起。
非常感谢你的帮助。问候!
#include <iostream>
using std::cout;
using std::endl;
#define PRESS_KEY std::cout<<"\nPresione Enter para continuar . . .\n";std::cin.get();
class IntArr{
private:
int * p;
int size;
int used;
//Verificador
void redimensionador(int cant);
public:
//Constructores
IntArr (int sz);
IntArr (int sz,int qtty,int *vec);
//Destructor
~IntArr();
//Visualizadores
void prtArr (void) const;
void prtArr (int cant);
//Accesores
int getSize(){return size;};
int getUsed(){return used;};
//Operaciones
void addElement(int xx);
void addElement(int qtty,int *vec);
};
//Constructores
IntArr::IntArr(int sz){
size = sz;
used = 0;
p = new int[size];
}
IntArr::IntArr(int sz,int qtty,int* vec){
if(qtty>sz){
sz = qtty;
}
size = sz;
used = qtty;
p = new int[size];
p = vec;
}
//Destructor
IntArr::~IntArr(){
delete []p;
}
//Visualizadores
void IntArr::prtArr(void) const{
if(used == 0){
cout<<endl<<"El array no tiene elementos."<<endl;
}
else{
cout<<endl<<"Array: ";
for(int i=0;i<used;i++){
cout<<p[i]<<", ";
}
cout<<endl;
}
}
void IntArr::prtArr(int cant){
if(used == 0){
cout<<endl<<"El array no tiene elementos."<<endl;
}
else{
cout<<endl<<"Array: ";
for(int i=0;i<cant;i++){
cout<<p[i]<<", ";
}
cout<<endl;
}
}
//Operaciones
double IntArr::getAvg(){
double acum = 0;
for(int i=0;i<used;i++){
acum += p[i];
}
return (acum/used);
}
void IntArr::addElement(int xx){
redimensionador(1);
p[used] = xx;
used++;
}
void IntArr::addElement(int qtty,int *vec){
int j=0;
redimensionador(qtty);
for(int i=used;i<(used+qtty);i++){
p[i] = vec[j];
j++;
}
used += qtty;
}
//Verificador
void IntArr::redimensionador(int cant){
if(cant+used>size){
if(cant > 5){
size += cant;
}
else{
size += 5 + cant;
}
}
}
int main(int argc, char *argv[]){
int v_aux[]= {0,5,10,15,20,25,30,35,40};
IntArr A(10,sizeof(v_aux)/sizeof(int),v_aux);
cout<<" size:"<<A.getSize()<<endl<<" used:"<<A.getUsed()<<endl;
A.prtArr();
A.addElement(77);
cout<<" size:"<<A.getSize()<<endl<<" used:"<<A.getUsed()<<endl;
A.prtArr();
A.addElement(11);
cout<<" size:"<<A.getSize()<<endl<<" used:"<<A.getUsed()<<endl;
A.prtArr();
A.addElement(8,v_aux);
cout<<" size:"<<A.getSize()<<endl<<" used:"<<A.getUsed()<<endl;
A.prtArr();
PRESS_KEY;
}
如果您 运行 内存不足,您不能仅仅通过与一个整数相加来表示您有更多的大小。您必须重新分配内存,将旧数组中的值复制到新数组中,然后删除旧数组。
这里也需要注意一下。原始指针很容易出错,我看到你这里有一些奇怪的结构。例如,IntArr::IntArr(int sz,int qtty,int* vec) 你分配了一个指针,然后立即覆盖它。该分配是一个泄漏。
确保正确更新大小和使用情况,以免忘记实际拥有多少内存。当大小发生变化时,您的缓冲区也必须发生变化,否则您将不同步。
我注意到的一个问题是以下几行:
p = new int[size];
p = vec;
当你这样做时:
- 你有内存泄漏。
new int[size]
返回的值在您的程序中丢失。 - 您将
p
指向main
中静态定义的数组。当您在析构函数中使用delete [] p;
时,这会导致未定义的行为。
我猜您想将值从 vec
复制到 p
。您必须将值一一复制。
手动编码的版本:
for (int i = 0; i < used; ++i )
{
p[i] = vec[i];
}
使用标准库函数std::copy
:
std::copy(vec, vec+used, p);
即使此构造函数也有内存泄漏并可能导致未定义的行为(例如,当 vec
指向局部数组的第一个元素时,或者当参数 vec
指向的数组将是已删除)。
IntArr::IntArr(int sz,int qtty,int* vec){
if(qtty>sz){
sz = qtty;
}
size = sz;
used = qtty;
p = new int[size];
p = vec;
}
首先分配一块内存,并将其地址分配给p
,然后重新分配p。
p = new int[size];
p = vec;
您必须将参数 vec
指向的数组中的元素复制到数据成员 p
指向的已分配内存中。
还有这个成员函数
void IntArr::redimensionador(int cant){
if(cant+used>size){
if(cant > 5){
size += cant;
}
else{
size += 5 + cant;
}
}
}
没有意义。您必须重新分配数据成员 p
.