类的 C++ 动态内存分配

标签 c++ dynamic-memory-allocation

在动态分配来自第一类的对象时,我在第二类中遇到了问题。有时当 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/

相关文章:

c++ - 你如何初始化一个可以设置为默认数组并将输入/输出作为数组的类函数?

c++ - 加载 WAV 文件时出现 OpenAL 错误 40963

C++11 std::chrono 现在减去最小值

c++ - 如何在 Visual Studio 2012 Visual C++ 中动态分配内存

在C中创建2(或3?)维字符串数组

c - 使用指针算法迭代,可能的内存泄漏?

c++ - 使用 fstream 打开文本文件但文件名字符不在 ASCII 中

C : scanf skips the first iteration while taking char* inputs from user through scanf

c - 我应该如何修复这个有趣的 getdelim/getline (动态内存分配)错误?

c - 分配后访问结构体成员