もしnewがオブジェクトをfreeで解放したら、何か問題がありますか?

2366 ワード

C++の中のNEW/DELETEとmaclloc/freeについて.
昨日面接でこの質問をされましたが、newの相手がfreeで釈放されたら、どんな質問がありますか?
しばらくこの見知らぬ人に聞かれて、そこで感じて言えば、間違いを報告するはずです.newとFREEはペアのメモリ操作APIではないからです.
後で考えてみると、deleteも割り当てられたメモリを消去し、freeも同様の機能であり、エラーが報告されない可能性があります.また、delete処理中にfreeより一歩多くのステップが構造関数を呼び出すためです.したがって、エラーは報告されないかもしれませんが、割り当てられたオブジェクトに対して後続のプロファイルクリーンアップ動作は行われていません.
今日は何行かのコードを書いてみたいと思います.
まず、このコードを見てみましょう.
 
 #include 
 using namespace std;
 class nf{
   public:
     nf();
     ~nf();
   public:
     int * get();
     void set(int i);
     private:
     int * pi;
  };
 
  nf::nf()
  {
      cout<

 
上のコードにはクラスが定義されています.クラスにはポインタメンバーがいますが、なぜポインタメンバーでクラスのメンバーのメモリをnewでスタックに割り当てたいのか.コンストラクション関数でメモリを割り当て、コンストラクション関数でメモリを解放します.同時にget()メンバー関数も定義され、そのメンバーのポインタを返します.set()関数は主にメンバーポインタが指すオブジェクトに値を付与する.
 
まず通常の場合、通常はnewでクラスのオブジェクトを作成し、オブジェクト作成時にコンストラクション関数を呼び出してメンバーポインタにメモリを申請し、set()で値を付与した後、get()で返し、ポインタで読み取った値はset()の値であるべきです.
deleteで前の申請のオブジェクトを削除すると、同じように構造関数を呼び出し、構造関数の中で申請したメモリを解放します.get()で返されたポインタで読み取ると、結果は0になります.初期化されているからです.
以上の分析により、次のmain()呼び出しを表示します.
  int main(int argc,char ** argv)
  {
      nf * pnf = new nf();
  
      pnf->set(100);
      int * pp = pnf->get();
      cout<

コンパイル:
g++ -o m m.cpp
実行:
./m
結果:
[ter]$ ./m  
  
  
  
   
nf construction
100
nf destruction

以上のように分析した.
さらに分析してみると、newでオブジェクトを作成し、freeでメモリを解放したらどうなるのでしょうか.
定義に基づいて:new()関数は実際の過程で2つのステップで操作され、第1のステップはメモリ空間を割り当てることであり、第2のステップはクラスの構造関数を呼び出すことである.delete()も同様に2つのステップであり、第1のステップはクラスの構造関数を呼び出し、第2のステップはメモリを解放することである.malloc()とfree()はメモリの割り当てとメモリの解放操作にすぎない.
ではnewで割り当てられたメモリをfreeで解放すると、構造関数を呼び出すプロセスが少なくなります.また、コンストラクション関数で申請したメモリは、コンストラクション関数が呼び出されていないため、そのメモリは解放されていないので、メモリの値を出力すると、元の設定値100になるはずです.
コードコールは次のとおりです.
  int main(int argc,char ** argv)
  {
      nf * pnf = new nf();
  
      pnf->set(100);
      int * pp = pnf->get();
      cout<

コンパイル:
 g++ -o m m.cpp
実行:
 ./m
結果:
 nf construction
 100
 100
 
上の分析と同じです.
上のことを経て、やはりその同じ道理を説明して、あなたが経験したことの多少を気にしないで、あなたが事に対して考えているかどうかを気にします.どんな問題があっても、既存の基礎知識の基本的な定義を通じて思考分析を行い、経験したことがなくても、出会ったことがないことでも、結果は分析される可能性があります.もちろん考え終わったら、後で機会があれば試したほうがいいです.