私の知る限り、C/C++ のニア ポインター (またはファー ポインターではない) は、RAM 内の実際のアドレスよりも非常に小さいアドレス値を持っています。したがって、ポインター (int 型または任意のオブジェクト型ポインターなど) をインクリメントし続けると、特定の値でロールオーバーされます。さて、私の質問は次のとおりです。それが指す値をロールバックした後、有効かどうか(メモリに大きなサイズのデータがあると仮定します)?
これが奇妙な質問であることは承知していますが、メモリの割り当てと割り当て解除を継続的に行っている状況があります。など0x20
の無効なアドレス値が原因で、特定の時点でバイナリがクラッシュすることがわかりました
。0x45
0x10101
この問題はポインター値のロールオーバーが原因であり、ポインターが原因でアドレスがロールオーバーされているため、無効なアドレスが表示され、アクセス時にクラッシュしているのではないかと思っていました。
私が言及している状況が、質問されているのと似ていることを願っています。違うとしても、両方の答えが知りたいです。「連続インクリメントポインター」で検索してみましたが、答えが見つかりませんでした。
編集: これは、Red Hat Linux で G++ 4.1.2 20080704 (Red Hat 4.1.2-48) でコンパイルされた新しいコードです。
実際、共有するコードは非常に大きいです。しかし、私はそれを言葉で要約することができます: 3 つのスレッドがあります:
- 最初のスレッド: 割り当てられた Alert クラス オブジェクトを作成し、それをキューにプッシュします。
- 2 番目のスレッド: キューからアラートを読み取り、処理します。
- 3 番目のスレッド: 20 ~ 30 分の処理後に Alert オブジェクトに割り当てられたメモリを解放します。
2 番目のスレッドによって処理される前に、3 番目のスレッドが割り当てを解除していないことを確認済みです。
しかし、アラートは定期的に (つまり、1 秒間に数千回) 生成されるため、主な質問で言及されている問題を疑っていました。私の実装での注意点: Linux パイプ キューを使用して、あるスレッドから別のスレッドにプッシュしています。そのために、送信者側からオブジェクトのアドレス値のみをプッシュし、そこでオブジェクトを削除しないようにします。これは破損の可能性のある方法ですか?以下は、この特定のタスクのコードです。
Alert* l_alert = new Alert(ADD_ACTION,
l_vehicleType,
l_vehicleNo,
l_projPolyline,
l_speed,
l_slotId);
m_ResultHandler->SendToWorker(&l_alert);
キュー機能の実装:
S32 SendToWorker(queueDataType *p_instPtr)
{
S32 ret_val=SUCCESS;
QueueObj.Lock();
ret_val = QueueObj.Signal();
QueueObj.push(*p_instPtr);
QueueObj.UnLock();
return ret_val;
}
S32 GetFromReceiver(queueDataType *p_instPtr)
{
QueueObj.Lock();
while(QueueObj.size() == 0)
QueueObj.Wait();
*p_instPtr = QueueObj.front();
QueueObj.pop();
QueueObj.UnLock();
return SUCCESS;
}
レシーバーエンド:
m_alertQueue->GetFromReceiver(&l_alert)