あなたのCとC++コードの30の小さい細部を強くします


1ローカル変数の初期化
初期化されていないローカル変数を使用することは、プログラムのクラッシュを引き起こす比較的一般的な原因です.
2 WINAPI構造体の初期化
多くのWindows APIは、構造体パラメータを受け入れたり、返したりします.構造体が正しく初期化されていない場合、プログラムのクラッシュを引き起こす可能性があります.ほとんどのWindows API構造体にはcbSIzeパラメータが必要です.このパラメータはこの構造体のサイズに設定する必要があります.
注意:ZeroMemoryとmemsetで構造体オブジェクトを含む構造体を初期化しないでください.これにより、内部構造体が破壊されやすく、プログラムがクラッシュします.
3検出関数入力パラメータ有効性
関数設計の際,伝達されたパラメータの検出は常に推奨されている.たとえば、設計された関数が共通APIの一部である場合、外部クライアントによって呼び出される可能性があります.これにより、クライアントが送信するパラメータが正しいことを保証することは困難です.
4ポインタ変数の有効性の検出
ポインタを使用する前に、検出しないのは非常に一般的で、これは私たちがソフトウェアのクラッシュを引き起こす最も可能性のある原因と言える.ポインタを使用すると、このポインタがちょうどNULLである場合、プログラムが実行されると、異常が報告されます.
5初期化関数出力パラメータ
関数がオブジェクトを作成し、関数の戻りパラメータとして使用する場合.では、使う前に彼をNULLにコピーしてください.そうでなければ、この関数の呼び出し者はこの無効なポインタを使用し、プログラムエラーが発生します.
6ポインタとオブジェクトの解放
メモリが解放されたら、ポインタをNULLにコピーしてください.これにより、プログラムに無効なポインタがないことを確認できます.実は、削除されたオブジェクトアドレスにアクセスすると、プログラム異常が発生します.
7リリースハンドルのクリア
1つのハンドルを解放する前に、このハンドルを偽NULL(0またはその他のデフォルト)にコピーしてください.これにより、プログラムの他の場所で無効なハンドルが重複しないことを保証できます.
8 delete[]を使用して配列を操作する
個別のオブジェクトを割り当てる場合は、newを直接使用することができます.同様に、単一のオブジェクトを解放するときはdeleteを直接使用することができます.ただし、オブジェクト配列オブジェクトを申請するときはnewを使用できますが、リリース時にdeleteを使用するのではなく、delete[]を使用する必要があります.
9メモリの割り当てに注意
プログラムが実行されるときに決定されるバッファを動的に割り当てる必要がある場合があります.たとえば、ファイルの内容を読み込む必要がある場合は、ファイルサイズのバッファを申請してファイルの内容を保存する必要があります.このメモリを申請する前に、malloc()or newは0バイトのメモリを申請できないことに注意してください.そうしないと、malloc()ornew関数の呼び出しに失敗します.エラーのパラメータをmalloc()関数に渡すと、Cランタイムエラーが発生します.
10 assertの使用に注意
Asserts用語デバッグモードは、前提条件と後置条件を検出します.しかし、コンパイラがreleaseモードにある場合、Assertsはプリアセンブリフェーズで削除されます.したがって,Assertsでは我々のプログラム状態を検出することはできない.
11チェック関数の戻り値
1つの関数の実行に一定の成功があると判断するのは一般的なエラーです.関数を呼び出すときは、戻りコードと戻りパラメータの値を確認することをお勧めします.次のコードは、Windows APIを呼び出し続け、プログラムが実行されるかどうかは、関数の戻り結果と戻りパラメータ値に依存します.
12スマートポインタの使用
COMインタフェースなどの共有オブジェクトポインタを頻繁に使用する場合は、スマートポインタを使用して処理することをお勧めします.インテリジェントポインタは、オブジェクト参照記数を自動的に維持し、削除されたオブジェクトにアクセスしないことを保証します.これにより、インタフェースのライフサイクルに関心を持ち、制御する必要はありません.
メモリの使用に関するいくつかのアドバイス
13
コンパイラが自動的にこのような空間を解放するため、できるだけ静的キャッシュを使用します.
14
後で使用しない場合は、以前に割り当てられたメモリを手動で解放する必要があります.笑わないで、javaからC++を変えるプログラマーにたくさん出会ったことがあります.
15
C++ではcalloc/mallocではなくnewとdeleteを使用します(C言語のみの使用を推奨します).
16
newとdeleteがペアで使用されていることを覚えておいてください.newから出てきたメモリをfreeで解放しないでください.
17
関数伝達ポインタが指すキャッシュサイズの場合は、呼び出された関数のキャッシュ領域のサイズを必ず伝え、呼び出された関数操作後の実際のサイズを返してください.
18
コードライブラリsdkをパブリッシュすると、パッケージされたnewとdelete関数が提供され、単一スレッドまたはマルチスレッドで実行するときに多くの問題を回避できます.
19
動的メモリ割り当てを行う場合、割り当てメモリの空間サイズを統計するには、符号なし数を使用します.これにより、負の数を取り除くことができます.また、割り当てられたメモリ領域の最大値を確認することも覚えておいてください.
20
メモリを循環的に割り当てたり解放したりしないでください.これにより、プログラムの効率が低下し、セキュリティ上の事故を引き起こす可能性があります.
21
ポインタを解放した後にNULLを割り当てると、後でメモリが使用されるときのバーストイベントを回避できます.
22
ZeryMerroryおよびmemset は、バッファの文字列がライフサイクルを超えている場合にコンパイラによって最適化され、バッファの内容が悪意のあるソフトウェアによって捉えられる.ソフトウェアセキュリティの問題を引き起こし、特にパスワードなどの敏感な情報について話します.SecureZeroMemoryではこの問題は発生せず、バッファの内容が正しくクリアされることを保証します.比較的敏感な内容に触れる場合は、できるだけSecureZeroMemory関数を使用します.
23
パスワードのような機密情報データをメモリに格納し、削除を解放した後、乱数で上書きします.freeまたはdeleteは、以前に割り当てられたメモリが現在使用できないようにするだけで、メモリ内のデータは削除されていません.
24
プログラムにメモリが漏洩しているかどうかを確認する簡単な方法は、windowsまたはlinuxシステムの下でタスクマネージャを利用してメモリの使用量を確認することです.
25
サイズが0のバイトスペースは割り当てないでください.この動作は未定義で予知できません.
26
使用する前に、メモリ割り当てのポインタをよくチェックし、無効なポインタを使用しないでください.プログラムに異常とクラッシュが発生します.
27
集合を割り当てるときは、thing*pt=new thing[100];
28
newキーワードを使用する場合はtry-catch文ブロックを使用し、文ブロックを使用する必要がない場合はstd::thing*pt=new(std::nothrow)thing[100];
29
constとinlineを使用する場合は、できるだけ単独で定義しないで、できるだけ統一ファイルやクラスをカプセル化します.
30
非基本データ型の変数では、関数パラメータを渡すときにポインタまたは参照をできるだけ使用します.
個人の整理と総括、みんなが引き続き補充することを歓迎します