Lỗi invalid memory reference/ segmentation default

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/

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.

3 Likes

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

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

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

1 Like

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

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?