类的 C++ 动态内存分配

Posted

技术标签:

【中文标题】类的 C++ 动态内存分配【英文标题】:C++ dynamic memory allocation for classes 【发布时间】:2018-03-20 15:40:19 【问题描述】:

我在从第一类动态分配对象时遇到第二类问题。有时当 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 ;

【问题讨论】:

你的类有一个成员id,但是你也在你的构造函数中声明了一个名为id的局部变量。我不相信您想声明该局部变量(包括为其分配和释放内存)。 与您的问题无关,但您确实应该是consistent with your curly braces 菲尔是对的。相反,如果 char *id =.... 应该是......什么都没有。 如果你有一个文本控制台(带有你的程序输出)和一个文本输入框(这里)——请复制并粘贴文本。文字截图只是浪费大家的时间。 【参考方案1】:

我看到的问题:

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

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

     placovi = new ParkingPlac[brojplacovi] ;

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

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

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

3。内存泄漏

您没有任何代码可以确保:

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

    您不会释放先前分配的内存。


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

除非你被禁止,否则使用std::vector 而不是动态分配的数组和std::string 而不是动态分配的字符串。他们会处理大多数与内存相关的问题。

【讨论】:

我仅限于在这些变量上使用动态分配的内存

以上是关于类的 C++ 动态内存分配的主要内容,如果未能解决你的问题,请参考以下文章

C++ 动态分配内存

C++程序的内存分区,为什么要使用动态内存,动态内存的分配使用释放

C++内存分配及变长数组的动态分配

在 C++ 中的 2D 动态内存分配数组中释放分配的内存

优化动态分配内存的变量

动态内存管理2