0

まだC++を学習していて、特定のエラーがまだあります:)。私は次の構成のオブジェクトを持っています:

class document {
private:
    char *denumire;
    char *tema;
    char *autorul;
    int num_pag;
    data last_edit;
public:
    document();
    document (const char *s1,const char *s2,const char *s3, int i1, data d1);
    document (const document&);
    document (const char *s1);
    ~document ();
    void printdoc(void);
    void chden(char *s);
    void chtema(char *s);
    void chaut(char *s);
    void chnumpag(int n);
    void chdata(data d);
};

問題は、次のコンストラクターで初期化しようとすると、セグメンテーション違反が発生することです。

document::document (char *s1, char *s2, char *s3, int i1, data d1) {
    denumire=new char[strlen(s1)+1];
    strcpy(denumire,s1);
    tema=new char[strlen(s2)+1];
    strcpy(tema,s2);
    autorul=new char[strlen(s3)+1];
    strcpy(autorul,s3);
    num_pag=i1;
    last_edit.an=d1.an;
    last_edit.luna=d1.luna;
    last_edit.zi=d1.zi;
    cout <<"Setarea documentului finisata\n";
}

私が理解している限り、「Setarea documentului finisata」というメッセージが表示され、その後にsegfaultが表示されるため、すべての変数が正しく割り当てられます。すべてのコードは、警告なしで正常にコンパイルされます。また、Googleで何かを検索しようとしましたが、私のような状況は見つかりませんでした。そのような奇妙な行動の原因は何でしょうか?

PS:コピーコンストラクターの実装:

document::document (const document& a) :
    denumire(new char [strlen(a.denumire)+1]),
    tema(new char[strlen(a.tema)+1]),
    autorul(new char[strlen(a.autorul)+1]),
    num_pag(a.num_pag),
    last_edit(a.last_edit)
{
    strcpy(denumire,a.denumire);
    strcpy(tema,a.tema);
    strcpy(autorul,a.autorul);
}

私は先生の例からそれを取りました。また、次の方法で変数を初期化します。

document c(s1.c_str(),s2.c_str(),s3.c_str(),i1,d1)

教師は、オブジェクトに動的に作成された文字列が含まれていることを要求しているためです:)

4

1 に答える 1

0

正確に何が問題なのかを確認してください。ただし、いくつかの指針を与えることができます。セグメンテーション違反は、次の理由で発生します: 1) プロセスのアドレス空間にないメモリ領域にアクセスしようとした場合 2) 初期化されていないポインタを使用しようとした場合

アドレス空間とは、RAM 内のプロセスに割り当てられたメモリを意味します

それが役に立てば幸い

于 2011-05-11T17:51:26.023 に答える