2

してはいけないことですか、そうですか。実際には、1 つのポインターに対して new を何度も使用します。

 double * a;
 a=new double (5);
 cout<<*a<<endl;

 a=new double(10);
 cout<<*a;
 delete a;

ありがとう。

解決策: 考えられる解決策の 1 つは?!

 double * a;
 a=new double (5);
 cout<<*a<<endl;
 delete a;
 a=new double(10);
 cout<<*a;
 delete a;

aポインターが空のセルを指しているかどうかわからない場合は、 NULL ポインターを使用できます。

 double * a=0;

 //... the code use *a to allocate or not some informations

 delete a;

 // ... the code continues with the possibility of allocate again using *a.
4

5 に答える 5

2

大丈夫ではありません - 最初に割り当てられたメモリがリークします。しかし、主な理由は、慣用的な C++ ではないということです。普通の古いもので何が問題なのですか

double a;
a = 5;
cout << a << endl;

a = 10;
cout << a;
于 2013-07-03T21:44:37.787 に答える
2

大丈夫です。ポインターは、必要なものを指すことができるためです。したがって、 adouble* pは type を持つ任意のオブジェクトを指すことができますdouble

ただし、特定の状況ではnew、メモリのブロックを編集してからポインターのターゲットを変更したため、完全に問題ありません。古い5メモリ ブロックにはポインタがなく、アクセスできなくなります。ただし、それでもメモリのブロックを占有します。これはメモリ リークと見なされます。

この場合、次のようなものを使用することができます

std::shared_ptr<double> p(new(10.0));

そして、あなたはそれを更新することができます

p.reset(new(5.0));
于 2013-07-03T21:49:10.783 に答える
2

フォローアップの質問への回答として (null ポインターを削除していないことを確認するにはどうすればよいですか): それは問題ではありません。 delete null何もしません。

いつでも状態を把握できるようにコードを作成することをお勧めします。つまり、ポインターの割り当ては 1 回だけにしてください。質問でイディオムを本当に使用したい場合は、スマート ポインターを使用します (リセットされるか範囲外になると、スマート ポインターが削除を行います)。

std::auto_ptr a;
a.reset(new double(5));
cout << *a << endl;

a.reset(new double(10));
cout << *a << endl;

// no need to call delete at all.  std::auto_ptrs destructor will do it for you.
于 2013-07-03T21:51:14.180 に答える
2

いいえ、メモリ リークが発生します。すべて newに対応する が必要deleteです。

于 2013-07-03T21:45:15.573 に答える
1

その前に、最初a=new double(10);にする必要があります。delete a;そうしないと、メモリを要求して解放しなかったため、小さなメモリ リークが発生します。コードは次のようになります。

double *a = new double(5);
cout << *a << endl;
delete a; // note the delete

a = new double(10);
cout << *a;
delete a;
于 2013-07-03T21:45:56.873 に答える