0

重複の可能性:
C ++削除-オブジェクトは削除されますが、データにアクセスできますか?

次の簡単なコードにメモリリークがあるかどうかを確認したいと思います。この関数では、ポインターを削除し、このポインターに新しいオブジェクトを割り当てます。これは合法ですか?g ++コンパイラでは、テストポインタを削除しても、そのメンバーにアクセスできます。これは私には奇妙に見えます。

class cTest{
public:
  cTest(double _m){
    m=_m;
}
  ~cTest(){}

  double m;
};

void function (cTest * test){
  delete test;
  std::cout<<test->m<<std::endl;
  test= new cTest(1.2);
}
int main(){
  cTest *t = new cTest(0.1);
  std::cout<<t->m<<std::endl;
  function (t);
  std::cout<<t->m<<std::endl;
  delete t;
  return 0;
}

印刷します

0.1

0.1

1.2

4

4 に答える 4

1

うん、それは漏れます。functionmainの値を実際に変更することはありませんt(パラメーターがvalueによって渡されるため)。

多くの場合、削除されたメモリを参照できますが、これはバグです(信頼性がありません)。

于 2012-11-27T04:45:15.887 に答える
1

有効期間が終了した後(スタック割り当てオブジェクトや後など)にポインタにアクセスするたびに、未定義の動作deleteに遭遇します。これは、動作し、決定したときに突然クラッシュする可能性があるため、単なるエラーよりもさらに悪い動作です。

ポインタはもう有効ではありません。不要な操作はすべてC++で実行されないため、データはまだ存在します。そのため、状況に応じてポインタが機能します。

于 2012-11-27T04:46:31.933 に答える
1

最初は、コードに2つの間違いがあります。

ポインタは値ではありません。

void function (cTest * test){
  delete test;
  std::cout<<test->m<<std::endl;
  test= new cTest(1.2);
}

test上書きされません。おそらく、ポインタ値を書き直すことを期待していますが、それはできません。やりたい場合は、ポインタのポインタCTest** testを使って引数を定義してください。または、戻り値を使用して新しいポインタ値を指定します。

#include <iostream>

class cTest{
public:
  cTest(double _m){
    m=_m;
}
  ~cTest(){}

  double m;
};

void function (cTest** test){
  delete *test;
  std::cout<<(*test)->m<<std::endl;
  *test= new cTest(1.2);
}
int main(){
  cTest *t = new cTest(0.1);
  std::cout<<t->m<<std::endl;
  function (&t);
  std::cout<<t->m<<std::endl;
  delete t;
  return 0;
}

しかし、このコードは意味がないと思います。

于 2012-11-27T04:47:01.880 に答える
1

はい、最初に割り当てられたオブジェクトのリークと二重削除があります。mainの「t」は、ポインターが参照またはダブルポインターによって関数に渡されないため、引き続き最初のオブジェクトを指します。

于 2012-11-27T04:48:54.890 に答える