gpt4 book ai didi

类的 C++ 动态内存分配

转载 作者:行者123 更新时间:2023-11-28 04:45:11 24 4
gpt4 key购买 nike

在动态分配来自第一类的对象时,我在第二类中遇到了问题。有时当 n < 3 或 4 时程序运行没有问题,但大多数时候当 n > 3 或什至有时当它更少时我运行代码它在第二个输入对象后崩溃。 crash-screenshot .任何有关如何解决此问题的帮助和提示都将不胜感激。

#include <iostream>
#include <cstring>

using namespace std;
class ParkingPlac{
private:
char adresa[20] ;
char id[20] ;
int zarabotka ;
int cena ;
public:
ParkingPlac() //first class
{
cout<<"Constructor "<<endl ;
}
ParkingPlac(char *adr , char *i , int c )
{
strcpy(this->adresa,adr) ;
this-> cena = c ;
char *id = new char [strlen(i)+1] ;
strcpy(this->id,i) ;
cout<<"Konstruktor"<<endl ;
delete[] id ;
}
~ParkingPlac()
{
cout<<"Destruktor" <<endl;
}
void print()
{
cout<<adresa << " "<<id<<" "<<cena<<endl ;
}
char *getid()
{
return id;
}
void setid(char *i)
{
strcpy(this->id,i) ;
}
char *getadresa()
{
return adresa;
}
int getcena()
{
return cena ;
}
void setadresa(char *a)
{
strcpy(this->adresa,a) ;
}
void setcena(int i)
{
this->cena = i ;
}
};
class PretprijatieParking{
private:
char imeprezie[35] ;
ParkingPlac *placovi;
int brojplacovi ;
public:
PretprijatieParking(char *ime)
{
strcpy(this->imeprezie,ime) ;
brojplacovi = 0;
}
void pecati()
{
cout<<imeprezie<<" "<<brojplacovi<<endl ;
}
~PretprijatieParking()
{
cout<<"DestruKtor"<<endl;
delete []placovi ;
}
void dodadiParkingPlac(ParkingPlac p)
{
int i ;
for(i = 0 ; i<brojplacovi;i++)
{
if(strcmp(placovi[i].getid(), p.getid()) == 0)
return ;
}
placovi = new ParkingPlac[brojplacovi] ;
placovi[brojplacovi].setadresa(p.getadresa()) ;
placovi[brojplacovi].setid(p.getid());
placovi[brojplacovi].setcena(p.getcena()) ;

cout<<placovi[brojplacovi].getadresa()<<endl;
cout<<placovi[brojplacovi].getid()<<endl ;
cout<<placovi[brojplacovi].getcena()<<endl ;
brojplacovi+=1 ;
}
};

int main(){
PretprijatieParking gradski("Mirko Mirkovski");
int n;
char adresa[50],id[50];
int brojcasovi,cenacas;
cin>>n;
for (int i=0;i<n;i++){
cin.get();
cin.getline(adresa,50);
cin>>id>>cenacas;

ParkingPlac edna(adresa,id,cenacas);
gradski.dodadiParkingPlac(edna);
}
//plakjanje
//cin>>n;
//for (int i=0;i<n;i++){
//
// cin>>id>>brojcasovi;
//
// if(!gradski.platiParking(id,brojcasovi))
// cout<<"Ne e platen parking. Greshen ID."<<endl;
//}

cout<<"========="<<endl;
gradski.pecati();
return 0 ;
}

最佳答案

我看到的问题:

1。为大小为 0 的数组分配内存

PretprijatieParking的构造函数中,成员变量brojplacovi被初始化为0。然后你继续使用:

     placovi = new ParkingPlac[brojplacovi] ;

2。使用越界索引访问内存

使用上面的行分配内存后,数组的最高有效索引是 brojplacovi - 1。但是,您继续使用:

     placovi[brojplacovi].setadresa(p.getadresa()) ;

3。内存泄漏

您没有任何代码来确保:

  1. 存储在先前分配的内存中的数据被复制/移动到新分配的内存中。

  2. 您不释放之前分配的内存。


您的代码中可能还有其他问题。快速浏览后,我看到了上面的内容。第一个和第二个问题足以导致未定义的行为。

除非您被禁止,否则请使用 std::vector 代替动态分配的数组,使用 std::string 代替动态分配的字符串。他们将处理大多数与内存相关的问题。

关于类的 C++ 动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49388459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com