2

----------------------------------------------1---------------------- -----------------------------------

組み込み Linux を実行している ARM 用のプログラムをコンパイルしています。私はもともとこのプログラムを C++ プログラムとして作成したので、コードにはいくつかのoperator newoperator deleteがあります。operator newここで、典型的な PC プラットフォーム用にs およびs を使用してコンパイルするoperator deleteには、リンカー (-lstdc++) に特定の引数を指定する必要があります。これが何をするのか正確にはわかりません。

ここで、ARM クロス コンパイラでこのリンカ オプションを使用しようとすると、正しくリンクできますが、実行時に次のメッセージが表示されて失敗します。

ld.so によって検出された矛盾: dl-deps.c: 622: _dl_map_object_deps: アサーション `nlist > 1' が失敗しました!

リンク オプションを省略すると、正常に実行されます。これはアサートの失敗のように見えますが、それは私があえて推測してみる限りです。誰かがこのエラーまたはその可能性のある原因に光を当てることができますか?

-----------------------------------------------2-- ----------------------------------

(-lstdc++) オプションを省略し、すべてのクラス ポインターをスタック上の変数インスタンスへのポインターに置き換えることにしました。これは機能しますが、明らかにずさんです。これは学生向けの例であるため、きれいにしたいと思います。それを行うためのクリーンな方法は、独自のoperator newand operator delete... を作成することですが、自己定義の演算子を実際にどのように使用するかは明らかではありません。

例として、someClass * foo = new someClass(arg);これは 3 つの (?) ステップです。

  1. 呼び出し演算子 new. 新しいクラス インスタンスにメモリを割り当てます。
  2. クラス コンストラクターの呼び出し。
  3. 演算子 new によって作成されたメモリ位置にクラス インスタンスを配置する

これらの手順の順序がわかりません。スタックにその型の新しい変数を作成するのとは別に、クラス コンストラクターを呼び出す方法がわかりません。そして、新しいクラス変数をどこから始めてもヒープに入れる方法がわかりません。

4

1 に答える 1