2

非常に大規模なアプリケーションでリストを表すクラスがあります。

CSMLNode
{
   CSMLNode *pChild;
   CSMLNode *pSibling;  

   CSMLNode()
   {
     pChild = NULL;
     pSibling = NULL;
   }         
}

最適化のために、作成されたノードオブジェクトはプールに保持され、アプリケーションの存続期間にわたって再利用されます。ノードオブジェクトの数が特定の数を超えた場合にのみ、ノードオブジェクトが解放されます。ノードオブジェクトがプールに解放されるか、プールから取得されると、pChildおよびの値はpSiblingNULLに設定されません。これにより、アプリケーションでクラッシュが発生していると思われます。

0xDDDDDDDDプールからノードオブジェクトを取得したときに値がNULLでない場合は、pChildとpSiblingの値をに設定することを計画しています。私の目的は、プールからノードオブジェクトを取得した後、またはプールからノードオブジェクトを取得した後に、適切なオブジェクトポインターを設定せずに、pChildまたはpSiblingポインターにアクセスしたときに、アプリケーションを強制的にクラッシュさせることです。pChildpSibling

これは私が期待しているように機能しますか?そうでない場合は、強制アクセス違反に対してどのポインタ値を指定する必要がありますか。

フルページヒープを有効にして、アクセス違反をできるだけ早く取得しました。

4

2 に答える 2

4

VisualStudioのデバッグCRTはすでにこれを行っています。ヒープから割り当てるメモリは0xcdcdcdcdに初期化されます。構造体にはポインターが含まれているため、初期化されていないポインターを逆参照すると、AVが自動的に生成されます。デバッグヒープの初期化値は、ここに記載されています

あなたは助ける必要はありません。独自のプールを維持することは避けてください。CRTは、Windowsの低フラグメンテーションヒープからの十分な支援を受けて、すでに優れた仕事をしています。それを維持したい場合は、デバッグCRTと同じアプローチを使用することをお勧めします。他のすべてをスキップしないでください。無人地帯は、メモリの破損を早期に検出するための優れた方法です。

于 2012-04-14T07:59:28.393 に答える
0

未定義の動作を呼び出し、アプリケーションをクラッシュさせる場合とクラッシュさせない場合があります。それはまた他の望ましくないことをするかもしれません。

0xDDDDDDDDをポインタとして(参照を解除せずに)格納するだけでも、未定義の動作です。

于 2012-04-14T07:14:38.377 に答える