0

http://sequitur.info/sequitur_simple.ccにコードがあります

mallocfree行を変更しました

R = (rules **) malloc(sizeof(rules *) * num_rules);
free(R);

newと_delete

R = (rules **) new(sizeof(rules *) * num_rules);  //ERROR
delete(R);

ただしg++、このエラーが表示されます。

error: expected type-specifier before â;â token
error: invalid conversion from âlong unsigned intâ to âvoid*â [-fpermissive]
/usr/include/c++/4.6/new:103:14: error:   initializing argument 2 of âvoid* operator new(std::size_t, void*)â [-fpermissive]
4

3 に答える 3

4

変数タイプが正しいと仮定すると、次のようになります。

R = new rules*[num_rules];

後でそれを解放するときは、

delete[] R;

しかし、おそらく、OPはここで「間違った」問題を解決しようとしています(このコードを設計するときに行われた仮定はおそらく正しくありません...)。詳細については、こちらのJerryCoffinの回答を参照してください。

関数のように使用される場合new(配置新規)については、refpの回答を参照してください。

于 2013-02-22T06:40:03.817 に答える
3

mallocどちらもストレージをnew割り当てますが、論理的にだけでなく構文も大幅に異なります。1つは単純な関数で、もう1つは演算子です。


ストレージを割り当てるにnum_rules rules*は、次のようなものを使用する必要があります。

rules ** R;

...

R = new rules* [num_rules];

...

delete [] R;

しかし、私はnew関数として呼び出されるのを見ましたか?

実際には、関数呼び出しのように見えるものを見たことがあるかもしれませんが、実際にはそうではありません。

以下のスニペットでは、アドレス でオブジェクトを初期化するようにnewに指示しますが、の数にメモリを割り当て0x123123いません。これは通常、「配置-新規」と呼ばれます。0x123123Obj

Obj * p = new (0x123123) Obj;
于 2013-02-22T06:42:10.537 に答える
1

これは、何かをする前にコードを注意深く見る必要がある場所です。 void print(){R =(ルール**)malloc(sizeof(ルール*)* num_rules); memset(R、0、sizeof(rules *)* num_rules); R [0] =&S; Ri = 1;

  for (int i = 0; i < Ri; i ++) {
    cout << i << " -> ";
    p(R[i]);
  }
  free(R);
}

それを注意深く見てください。ポインタ用のスペースを割り当てているという事実に特に注意してください。ただし、実際には、これらのポインタの1つnum_rulesだけを使用します()。R[0]

コードを書き直してからに変更するmallocnewではなく、動的割り当てを完全に排除し、プロセスでコードを大幅に簡素化して、次のようにする必要があります。

void print() { 
    cout << "0 -> " << p(&S);
}

pあまり徹底的に分析しなかったことを付け加えるべきだと思います。割り当てられた余分なデータを実際に使用している可能性があると思います。もしそうなら、コードはこれまで以上に深刻な書き直しが必要です-それは許すにはあまりにも恐ろしいことです(そして、残念ながら、RRiがグローバルであるという事実はそれがすべて可能性が高いことを示しています)。

結論:どのように見ても、ここでは間違った問題に取り組んでいます。mallocvs.newは完全に間違った場所です。

変更する場合は、std::vectorここで問題なく使用できるようです。

void print() { 
    std::vector<rules *> R(num_rules);

    R[0] = &S;

    // ...
}

編集:もう少し見てみると、p私の2番目の考えは正当化されたようです-最初の書き換えは正しく機能しないと確信しています。pはの残りのスペースを使用するだけでなく、R変更するRiため、最初は1回だけ実行されるループのように見えますが、実際には複数回実行されます。

結論:これを書いた男を無価値な白痴モロンと呼ぶことは、無価値な白痴モロンへの侮辱になるでしょう。

于 2013-02-22T06:47:00.013 に答える