Lỗi invalid meory reference/ segmentation default

c++

(ITSRD) #1

Chào mọi người!
Em đang gặp 1 vấn đề với một chương trình của thầy Ất:

Mình chạy trên các devc++ online nó bị lỗi:
Đối với web “paiza.io” thì xuất lỗi “invalid memory reference”,
đối với web onlinegdb xuất lỗi " segmentation fault",
mình không biết lỗi này là gì.

Code

 // #include <conio.h>
 // #include <stdio.h>
 #include <iostream>
 // #include <ctype.h>
 #include <cstring>
 using namespace std;
 class CON_VAT
 {
 protected:
 char *ten;
 public:
 CON_VAT()
 {ten = NULL;
 }
 CON_VAT(char *ten1)
 {
 strcpy(ten,ten1);
 }
 virtual void xung_ten()
 { }
 } ;
 class CON_MEO:public CON_VAT
 {
 public:
 CON_MEO() : CON_VAT()
 { }
 CON_MEO(char *ten1) : CON_VAT(ten1)
 { }
 virtual void xung_ten()
 {
 cout << "\nToi la chu meo: " << ten ;
 }
 };
 class CON_CHO:public CON_VAT
 {
 public:
 CON_CHO() : CON_VAT()
 { }
 CON_CHO(char *ten1) : CON_VAT(ten1)
 { }
 virtual void xung_ten()
 {
 cout << "\nToi la chu cho: " << ten ;
 }
 };
 class DS_CON_VAT // Danh sach con vat
 {
 private:
 int max_so_con_vat;
 int so_con_vat;
 CON_VAT **h ;
 public:
 DS_CON_VAT(int max);
 ~DS_CON_VAT();
 int nhap(CON_VAT *c);
 CON_VAT* xuat(int n);
 void thong_ke();
 } ;
 DS_CON_VAT::DS_CON_VAT(int max)
 {
 max_so_con_vat = max;
 so_con_vat = 0;
 h = new CON_VAT*[max];
 for (int i=0; i<max; ++i)
 h[i] = NULL;
 }
 DS_CON_VAT::~DS_CON_VAT()
 {
 max_so_con_vat = 0;
 so_con_vat = 0;
 delete h;
 }
 int DS_CON_VAT::nhap(CON_VAT *c)
 {
 if (so_con_vat==max_so_con_vat)
 return 0;
 int i=0;
 while (h[i]!=NULL) ++i;
 h[i]=c;
 so_con_vat++ ;
 return (i+1);
 }
 CON_VAT* DS_CON_VAT::xuat(int n)
 {

 if (n<1 || n > max_so_con_vat)
 return NULL ;
 --n ;
 if (h[n])
 {
 CON_VAT *c = h[n];
 h[n]=NULL;/*----------------------???---------------------*/
 so_con_vat-- ;
 return c;
 }
 else
 return NULL;
 }
 void DS_CON_VAT::thong_ke()
 {
 if (so_con_vat)
 {
 cout << "\n" ;
 for (int i=0; i<max_so_con_vat; ++i)
 if (h[i])
 h[i]->xung_ten();
 }
 }
 CON_CHO c1("MUC");
 CON_CHO c2("VEN");
 CON_CHO c3("LAI");
 CON_CHO c4("NHAT");
 CON_CHO c5("BONG");
 CON_MEO m1("MUOP");
 CON_MEO m2("DEN");
 CON_MEO m3("TRANG");
 CON_MEO m4("TAM THE");
 CON_MEO m5("VANG");
 DS_CON_VAT d(20);
 int main()
 {

 //clrscr();
 d.nhap(&c1);
 int im2 = d.nhap(&m2);
 d.nhap(&c3);
 d.nhap(&m1);
 int ic4 = d.nhap(&c4);
 d.nhap(&c5);
 d.nhap(&m5);
 d.nhap(&c2);
 d.nhap(&m3);
 d.thong_ke();
 d.xuat(im2);
 d.xuat(ic4);
 d.thong_ke();
 //getch();
 }

Mọi người giúp mình với nhé.
Thân!

original

original https://regex101.com/r/HiiqHg/1/


(rogp10) #2

Code cứ thế nào ấy, xuất từ mảng ra mà lại cho NULL luôn là thế nào (còn không delete)!

p/s: Hi vọng là code trên ko trích từ sách.


(ITSRD) #3

cái hàm xuat á, cho null ý nghĩa nghĩa là bỏ đi, hàm xuất tương ứng với việc bán đi một đối tượng, hàm nhập là bỏ một đối tượng vô chuồng


(Oni) #4

Lỗi do bạn chưa cấp phát bộ nhớ cho CON_VAT.ten


(ITSRD) #5

Mình đã giải quyết được vấn đề này.
Khi mình code trên visual studio code, thì nó đưa ra warning và không cho ra kết quả.
warning : ISO C++ forbids converting a string constant to char* đối với tên đối tượng của mèo và chó.
Mình khai báo biến tên với là con trỏ hằng const char *ten; là chạy oke


(ITSRD) #6

Nhưng mình chưa hiểu mối quan hệ ở đây giữa string và con trỏ hằng


(OniRanger) #7

Mình chưa dùng VS bao giờ, nhưng bạn dùng cách này thì gdb nó sẽ không cho bọn compile đâu


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?