cari

Rumah  >  Soal Jawab  >  teks badan

Pengecualian yang dilemparkan oleh C++ CopyConstructor! !

Kod adalah seperti berikut:

void CopyStr(char *&destination, char *&source) {
    int sz = strlen(source) + 1;//此处引发异常!!
    destination = new char[sz];
    for (unsigned i = 0; source[i] != 'rrreee'; i++)
        destination[i] = source[i];
    destination[sz - 1] = 'rrreee';
    return;
}

Data::Data(Data &adata) {
    CopyStr(adata.P_name, P_name);
    CopyStr(adata.address, address);
    CopyStr(adata.number, number);
}

Perihalan kod: Kelas Data kini mempunyai tiga ahli char*, iaitu P_name, alamat dan nombor.

Gambar yang disusun:

Sila beri saya jawapan, terima kasih! !

过去多啦不再A梦过去多啦不再A梦2805 hari yang lalu879

membalas semua(3)saya akan balas

  • 伊谢尔伦

    伊谢尔伦2017-05-31 10:41:26

    Pertama, parameter seperti char *&source ditukar kepada char *const &source, dan kedua, CopyStr(adata.P_name, P_name) ditukar kepada CopyStr(P_name, adata.P_name).
    Ini adalah kod yang saya uji, ia boleh dijalankan terus:

    #include <iostream>
    #include <cstring>
    using std::cout;
    using std::endl;
    using std::strlen;
    class Data
    {
    public:
      char *a = "";
      char *b = "";
      char *c = "";
      Data(char *a, char *b, char *c):a(a),b(b),c(c) {};
      Data(Data const &data);
    };
    
    
    int CopyStr(char * &des,  char *  const &source)
    {
      int sz = strlen(source) + 1;
      des = new char(sz);
      for (unsigned i = 0; source[i] != 'rrreee'; i++)
        *(des +i)  = source[i];
      *(des+sz - 1) = 'rrreee';
      return 0;
    }
    
    Data::Data(Data const  &data)
    { 
      CopyStr(a, data.a);
      CopyStr(b, data.b);
      CopyStr(c, data.c);
    }
    
    int main()
    {
      Data data = Data("abcd", "b", "c");
      char * p = "232323";
      Data data2 =  Data(data);
      char * p2 = "1232";
      CopyStr(p2, p);
      cout << p2 << endl;
      cout << data.a << endl;
      cout << data2.a << endl;
      return 0;
    }

    balas
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-31 10:41:26

    Dari manakah parameter kedua (seperti P_name) datang apabila memanggil CopyStr?

    balas
    0
  • phpcn_u1582

    phpcn_u15822017-05-31 10:41:26

    vs akan mengisi kawasan memori yang tidak dimulakan dengan 0xCCCCCCCC (ini juga merupakan nilai 烫烫烫的由来);
    考虑到你访问到了0xCCCCCCCC,所以要不就是你传进去了个非法指针,要不就是这个char*指针对应的字符串没有以'0'结尾;
    可以试着输出一下source, dan kemudian cuba untuk mengeluarkan data yang ditunjuk oleh bait penunjuk demi bait

    balas
    0
  • Batalbalas