C ++面接の基本(B)

1.ポインタ配列との間の差

配列の添字操作は、実際にポインタによって行わ。
ポインタインデックスの配列要素を指すデリゲートアレイは0であるが、例外がありますのsizeof(配列名)は配列全体のサイズではなく、ポインタのサイズを返し;&アレイ名のポインタではなくよりも、アレイへのポインタを返します添字アレイ要素がゼロへのポインタ。
パラメータとして配列名、配列の名前は、ポインタのインデックス0の配列要素を指しに変換されます。
ポインタ操作は、標準の動作効率の下でより高いことが、必ずしも良いメンテナンス性のインデックス操作を持っていないかもしれません。
配列とポインタは同じではありません。

2.野生何のポインタ?

これは、削除されたオブジェクトへの野生のポインタであるか、メモリポインタの制限された領域へのアクセスのために適用されます

3. Cでスマートポインタを導入++

主に割り当てられたヒープメモリを管理するために使用されるスマートポインタ、それは一般的なパッケージスタックポインタオブジェクトです。ときにオブジェクトのスタックのライフサイクルの終わりには、アプリケーションは、メモリリークを防ぐために、メモリ・デストラクタで解放されます。C ++ 11、最も一般的に使用される参照カウント法を使用shared_ptrのスマートポインタ型であり、現在のレコード番号が参照されるメモリリソーススマートポインタ。参照カウントは、ヒープメモリ上に割り当てられています。参照カウントが満了したときにプラス1、ときに、新しい1参照カウントをデクリメントします。参照カウントが0の場合のみ、スマートポインタは自動的にメモリリソース参照を解放します。ポインタとしてスマートポインタをshared_ptrのように直接初期化するときは、クラスがあり、通常のポインタを割り当てることはできません。これは、コンストラクタまたは関数をmake_shared通常のポインタを通過させることができます。そして、通常のポインタget関数によって得ることができます。

4.スマートポインタメモリリークの場合があります

お互いにshared_ptrのメンバ変数ポインティングを使用して互いにときに2つのオブジェクトが、メモリリークが生じる、循環参照の参照カウントの失敗をもたらすであろう。

5.どのようにスマートポインタの解決メモリリーク

弱いポインタweak_ptrを導入循環参照によって引き起こされるメモリリークを解決するために、通常のポインタに類似しているが、共有参照カウントを指していないメモリ・オブジェクトを管理しないように、weak_ptrを基準カウント値を変更しないコンストラクタメモリが、それは、管理オブジェクトが不正なアクセスを防止するためにリリースされているかどうかを検出することができます。

なぜデストラクタは仮想でなければなりません6.?なぜ、デフォルトのC ++デストラクタ仮想ないテストサイト:仮想関数デストラクタ

デストラクタは、親クラスが仮想関数に設定されている、それは我々の新しいサブクラス、サブクラスのオブジェクトに、その後、基本クラスのポインタは、ベースポインタを離すことが保証継承することができるスペースのサブクラスを解放することができ、メモリリークを防ぎます。
追加の仮想関数テーブルと仮想仮想関数テーブルポインタ、追加のメモリーため、デフォルトC ++のデストラクタ仮想関数は必要ありません。継承されないクラスの場合は、仮想関数の場合、そのデストラクタは、メモリが無駄になります。したがって、デフォルトのC ++デストラクタ仮想ではないが、それは親クラスの仮想関数セットとして必要な場合にのみ。

効果7.C ++デストラクタで

コンストラクタとデストラクタ対応し、それらのライフサイクルのオブジェクト終わり、そのような目的関数が完了呼び出された場合など、システムが自動的にデストラクタを実行します。
デストラクタ名は、コンストラクタからそれを区別するために、ちょうど〜、〜例えばスタッド()シンボルのビット反転機能名を追加し、クラス名と同じでなければなりません。これは、任意のパラメータ、戻り値のない(void型を含む)を取ることができません。唯一のデストラクタは、オーバーロードすることはできません。
ユーザーがデストラクタを書き込まない場合は、コンパイラが自動的にデフォルトのデストラクタ(たとえカスタムデストラクタが生成されます、コンパイラは常にデストラクタは、私たちのために合成、およびカスタムデストラクタ場合されます機能、リコール合成されたデストラクタを定義し、最初の呼び出しのデストラクタから実行されたコンパイラ)、それは任意の操作を実行しません。だから、多くの明示的なクラスのデストラクタのない単純な。
クラスポインタを有し、動的なアプリケーションメモリの使用中にあれば、メモリリークを回避するために、前のクラスの破壊、解放されたメモリ空間のアプリケーションにデストラクタを表示させることが好ましいです。
クラスデストラクタ配列:1)自身がクラスデストラクタ由来; 2)デストラクタ対象部材; 3)基底クラスデストラクタ。

8.静的関数と仮想関数との間の差

時間が、実行時バインディング仮想関数の動的に実行されていると判断されたコンパイル時に静的な機能。メモリのオーバーヘッドを呼び出すときに、仮想関数テーブルメカニズムと仮想関数は、増加しますので

9.トークオーバーロードとカバー

過負荷:二つの機能と同じ名前が、異なるパラメータリスト(番号、タイプ)は、戻り値の型が同じスコープ内に、必要とされない
書き換え:サブクラスは親クラスを継承は、親クラスの仮想関数でありますこの仮想関数のサブクラスで再定義され、このような状況は、書き換え可能です

10.トークはstrcpyとstrlen関数

strcpyの文字列コピー関数のプロトタイプ:
char型のstrcpy(char型のDEST、CONST文字* SRC)。

destにSRCからバイトコピーによってバイト、それが遭遇するまで、「\ 0」末端全く指定された長さが存在しないため、バッファオーバーフローの脆弱性で、その結果、クロスボーダーのコピーにつながる可能性があり、セキュリティのバージョンはstrncpyを関数です。
STRLEN関数は、文字列の計算された長さの関数である「\ 0」の間に先頭からの文字数を返します。

11.あなたは仮想関数とポリモーフィズムを理解します

マルチ状態が過負荷に静的および動的なマルチステート多状態、多状態主として静的に分割され、それはコンパイル時に決定されている、動的多型は仮想関数機構が実装され、実行時に動的バインディング。たとえば:子クラスの機能を書き換えた後、呼び出したときにポインタが親クラスを呼び出すために使用されるサブクラスのオブジェクトに親クラスのポインタの型は、親クラスのオーバーライドされた仮想関数をサブクラス親クラスでも、あなたはサブクラスで仮想仮想関数を追加する必要はありません時間を書き換え、仮想キーワードの追加の関数として宣言されています。
仮想関数を実装したクラスは、一部のように初めに仮想関数は、仮想関数テーブルへのポインタの仮想関数テーブルへのポインタで、テーブルには、仮想関数のアドレス、実際の仮想関数スニペットを入れています中(の.text)。サブクラスはサブクラスは親クラスの時間の仮想関数をオーバーライドする場合、仮想関数テーブルを継承する親クラスの時間を継承する場合、仮想関数テーブルアドレスの再書き込み機能アドレスにその後継で置き換えられます。効率が低下する、アクセス・メモリのオーバーヘッドが増加します仮想関数を使用してください。

私と私は++です++の違いについての12の回答

++ iが戻り、その後、1をインクリメントし、iは、その後インクリメント最初戻る++します

C ++で定数定義された方法についての13話がありますか?定数は、位置のメモリに保存されていますか?

C ++で定義されている定数は、定義された定数を初期化する必要があり、加えて、トップレベルのconstオブジェクトタイプです。局所オブジェクト定数のグローバル定数/静的記憶領域に格納されたグローバルオブジェクトに対して、スタック領域に格納されています。記憶領域に記憶されたリテラル定数、定数、定数のために。

14.新しい答える何/削除のmalloc /無料の違いです

まず、新しい/ C ++キーワードを削除して、malloc関数/自由は、コンストラクタとデストラクタを呼び出すことはありませんメモリ空間を使用して、アプリケーションのサイズを示す必要がありますC言語のライブラリ関数、タイプのためのオブジェクトクラスであり、

15.仮想関数テーブルには、特定のランタイムポリモーフィズムを実現する方法について話をしますか?

親クラスの仮想関数、仮想関数テーブルは、関数のアドレスを交換した場合、サブクラスは、仮想関数が存在しているオブジェクトのクラスのために、上書き、VS、頭部オブジェクトモデルオブジェクトは、仮想関数テーブルへのポインタが含まれていますこれは、多形性のメカニズムによって達成されます。

話をする16 C言語では、関数呼び出しを作成する方法ですか?

各関数呼び出しは、関数のスタックを割り当てプロセススタック内の機能を実行します。呼び出す前に、ESP、現在の関数ポインタプッシュ、スタックにリターンアドレスを置きます。

17.トークフォーク、待って、exec関数

親プロセスは、メモリを割り当てるための現実的なコピーメカニズムを書くために時間を使用するプロセスがある場合には、両方のプロセスは、メモリの同じ部分を読んでいる、このときだけは、EXEC機能を親プロセスのページ・テーブルのコピーを親プロセスのコピーのコピーをフォークを使って子プロセスを生成し、エルフは、親プロセスと子プロセスから親プロセスが、別のプログラムを実行することができます交換するファイルを読み込むことができます。フォークは、親プロセスpidから子プロセスを返す親待機閉塞が子プロセスのステータス変更、成功リターン0、-1エラーの実装まで、子から発生します呼び出しは0を返します。子プロセスのexecを実行が成功し、新しいプログラム、ノーリターン値から実行を開始し、返すことができなかった-1

18.静的関数と仮想関数の違いについての回答

時間が、実行時バインディング仮想関数の動的に実行されていると判断されたコンパイル時に静的な機能。メモリのオーバーヘッドを呼び出すときに、仮想関数テーブルメカニズムと仮想関数は、増加しますので

19. C ++のメモリ管理は、何について話をしますか?

C ++では、仮想メモリは、コードセグメント、データセグメント、BSSセグメント、ヒープ、ファイルマッピング領域とスタック領域の6つの部分に分割されます。
コードセグメント:読み出し専用メモリ領域とテキスト領域、文字列定数、テキスト領域に格納された機械コード・プログラムを記憶し、前記読み出し専用の記憶領域。
データセグメント:初期化グローバルと静的変数に格納されたプログラム
群BSS:ストレージ初期化されていないグローバルおよび静的変数(ローカル+グローバル)、およびすべての変数が0とグローバル静的変数に初期化されます。
ヒープ領域:メモリヒープの動的割り当てでは、あなたは、あなたが手動で割り当てられたメモリを解放して自由に/新しい/ malloc関数を呼び出す際に削除呼び出す必要があります。
マッピングエリア:ストレージおよびダイナミックリンクライブラリファイルマッピング関数を呼び出すにはのmmap
スタック:リターンアドレス、パラメータ、関数の戻り値を格納するスタック領域を使用してローカル変数

メモリ割り当てC ++ / Cの約20で講演

4G 32bitCPUアドレス可能な線形空間、各プロセスは0〜3Gは、ユーザ・モード・スペースである、独自の別個の4Gの論理アドレスを有し、3〜4Gは、カーネル空間で、同じ論理アドレス異なるプロセスは、異なる物理アドレスにマッピングされます。以下のように論理アドレスが分割:
個々のセグメントを次のように
3Gユーザ空間とカーネル空間1G
静的領域:
テキストセグメント(コード・セグメント):読み出し専用メモリ領域とテキスト領域、前記文字列定数記憶読み出し専用の記憶領域、テキスト領域マシンコード、プログラムを格納。
データセグメント(データセグメント):初期化グローバルと静的変数に格納されたプログラム
セグメントBSS:(グローバル+ローカル)初期化されていないグローバルおよび静的変数を格納し、すべての初期化、グローバルおよび静的変数0、用メインプログラムを実行して初期化されていないグローバル変数と静的変数は、前統一ときクリアされます。その初期化されていないグローバル変数コンパイラが0に初期化され
、ダイナミックエリア:
ヒープ(ヒープ):プロセスは、malloc関数の呼び出しだけmalloc関数を呼び出すときに割り当てられたヒープを使用して、何のスタックセグメントされませんし、動的に実行の過程で増加させることができる場合にはヒープサイズは、(ポインタの動きを破る)、上位アドレスに低いから増加しました。メモリを割り当てるとき、この小さな領域を使用します。mm_structについてのstart_brk、BRKによって識別される終了アドレスでスタック構造体の先頭アドレスで識別されます。
メモリマッピング・セグメント(マップエリア):(ときのmalloc mmap関数と呼ばれる)大容量メモリ用のダイナミックリンクライブラリおよびその他の文書のマッピングアプリケーションを格納する
スタック(スタック):関数の戻りアドレス、パラメータ、ローカル変数を格納するスタック領域を使用して、値を返す、高いから低アドレス成長に取り組みます。あなたは、プロセスが最大スタックサイズを持つことになります作成すると、Linuxは、ulimitのコマンドで指定することができます。

おすすめ

転載: www.cnblogs.com/Hijack-you/p/11564998.html