1

この関数の例を見てください:

RuntimeConfiguration* conf_rt_conf() {

    RuntimeConfiguration *conf;
    conf = new RuntimeConfiguration();
    conf->arch_path="./archive";
    conf->err_log="./err_log";
    conf->fail_log="./fail_log";
    conf->msg_log="./msg_log";
    conf->save="html, htm, php";
    conf->ignore="jpg, gif";
    conf->cookies="";

    return conf;
}

ここではすべて正常に動作しますが、次のようなものを実行すると:

DatabaseInput** conf_db_input() {

    DatabaseInput **db_input;
    db_input=(DatabaseInput **)malloc(NUMB_SITES*sizeof(DatabaseInput *));
    for (int i=0;i<NUMB_SITES;i++) db_input[0]= new DatabaseInput();

    db_input[0]->full_name="ABCNews";
    db_input[0]->alias="abcn";
    db_input[0]->prefix="/eng";

    db_input[1]->full_name="Rzeczpospolita";
    db_input[1]->alias="rp";
    db_input[1]->prefix="/pol";

    return db_input;
}

最初の割り当てでセグメンテーション違反が発生します。おそらく、この構造体に割り当てられた固定メモリ ブロックと関係があります。正しく動作させるにはどうすればよいですか?

4

9 に答える 9

6

私は変わるだろう

for (int i=0;i<NUMB_SITES;i++) db_input[0]= new DatabaseInput();

これを開始するには:

for (int i=0;i<NUMB_SITES;i++) db_input[i]= new DatabaseInput();
于 2009-04-28T13:48:32.300 に答える
3

あなたのコードは、いくつかの質問を促します:

  • RuntimeConfiguration の宣言は何ですか?
  • なぜ malloc と new の使用を混在させているのですか?
  • std::vector のような C++ コンテナーを使用していないのは何ですか?
于 2009-04-28T13:48:51.940 に答える
2

まず... (デフォルトの) コンストラクターについて聞いたことがありませんか? これは、「new」を使用した C コードのように読み取りますが、これは常に少し怖いです。

次に、新しく割り当てられたすべての構造が に保存されますがdb_input[0]、これは間違っているようです。

于 2009-04-28T13:47:52.020 に答える
2

初見で

db_input[0]= 新しい DatabaseInput();

そうあるべきだと思う

db_input[i]= new DatabaseInput();

malloc 操作の結果を確認することもお勧めします。

于 2009-04-28T13:49:09.817 に答える
1

あなたの「for」ループは参照する必要はありませdb_input[i]んか?

于 2009-04-28T13:47:52.020 に答える
1

多分これ:

DatabaseInput *db_input[];
db_input = new DatabaseInput*[NUMB_SITES]; // Creates an array of pointers
for (int i=0; i<NUMB_SITES; i++) db_input[i]= new DatabaseInput();

働くことができますか?(私はそれをテストしませんでした)

使用されているメモリを解放するには、次のようにする必要があることに注意してください。

for (int i=0; i<NUMB_SITES; i++) delete db_input[i];
delete[] db_input;
于 2009-04-28T13:58:14.647 に答える
0
db_input[0]= new DatabaseInput();

実際には 0 の代わりに i がありました。いくつか試してみたところ、ソース コードをコピーするときにそのゼロを見逃していたので、それは答えではありません。

===編集===

db_input = new DatabaseInput*[NUMB_SITES];

それはうまくいきました、ガストンに感謝します:)

于 2009-04-28T15:09:47.847 に答える
0

おそらく、db_input[i] を使用する必要があります

于 2009-04-28T13:47:21.553 に答える
0

詳細がわからないと、エラーを特定できません。しかし、いくつかの発言:

  • 特に同じ関数で new と malloc を混在させると、本当に問題が発生します。本当に正当な理由がある場合を除き、そうしないでください。新しく割り当てられたバッファーで free を使用するか、delete と malloc で割り当てられたバッファーを使用する可能性が非常に高いためです。
  • インデックスが変更されないため、個々の DatabaseInput を割り当てるときにエラーが発生する可能性が最も高い
于 2009-04-28T13:51:45.270 に答える