0

少し変更された MobileC ビルドを使用しているときに、興味深い問題が発生しました。

マクロでセグメンテーション違反が発生しますが、コードにprintfsを入れると (C が解釈されているため、それ以外の方法でデバッグすることはできません)、それが発生する正確なポイントを取得できません。

これはコードです:

...
printf("just to check there is no problem accessing "node" %d\n", node);\
printf("this will be printed\n"); \
node_type##_Destroy(node); \
printf("this will not be printed\n"); \
...

Destroy のコードは次のとおりです。

int name##_Destroy( name##_p name ) \
{ \
printf("this will not be printed\n");    \
...

コードのこの部分は ( printfsを除いて) 変更していないので、問題ないと思います。ここで何が起こっているのか分かりますか?

4

3 に答える 3

0

削除時のセグメンテーション違反は、ほとんどの場合、破損したヒープを指しています。ポインターが存在するヒープ (または前/次のポインターを追跡している場所) が何かによって破壊され、ハイパースペースへのジャンプが発生しました。マネージ コードを使用すると、この可能性は低くなりますが、それでも私はここから始めます。

于 2013-04-08T16:41:30.873 に答える
0

回答ありがとうございます。今、私は何が起こったのか知っています。

ディートリッヒ・エップ、確かにnodeintではありませんでした(私はエラーに失敗し、何が起こっているのか手がかりがなかったので、それにアクセスする際に問題があったかどうかを知りたかっただけです)。C マクロについて教えていただきありがとうございます。私は少し読んだことがありますが、最終的に何が起こっているのかを理解しました。

node_type タイプはagentでした。したがって、マクロは agent_Destroy(node) に展開されます。問題は、Mobile Cコードに、agent_Destroy(agent_p エージェント) という名前の関数があったことです。何が起こったのかというと、両方の関数が実行され、最初の関数はコードで直接定義されたもので、セグメンテーション違反がありました。

于 2013-04-10T09:43:40.747 に答える