C++ 更新指针?

C++ 更新指针?,c++,pointers,new-operator,C++,Pointers,New Operator,这是一件不该做的事,还是正确的?事实上,在一个指针上多次使用new: double * a; a=new double (5); cout<<*a<<endl; a=new double(10); cout<<*a; delete a; 这不好-第一个分配的内存将泄漏。但主要原因是它不是惯用的C++。老古董怎么了 double a; a = 5; cout << a << endl; a = 10; cout <

这是一件不该做的事,还是正确的?事实上,在一个指针上多次使用new:

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

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

这不好-第一个分配的内存将泄漏。但主要原因是它不是惯用的C++。老古董怎么了

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

a = 10;
cout << a;
双a;
a=5;

cout否,这将导致内存泄漏每次
新建
都需要相应的
删除

才能执行
a=new double(10)
需要
删除一个第一个。否则,最终会出现一个小的内存泄漏,因为您请求了内存,然后再也没有释放它。您的代码应该如下所示:

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

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

没关系。因为指针可以指向它想要的东西。因此,
double*p
可以指向类型为
double
的任何对象

但是,在您的特定情况下,它并不完全正常,因为您已
new
加载了一块内存,然后让指针更改其目标。旧的
5
内存块没有指向的指针,您无法再访问它;但是,它仍然占用一块内存。这被视为内存泄漏

在这种情况下,您可能需要使用

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

在回答后续问题时,(如何确保没有删除空指针):这无关紧要<代码>删除空值
不执行任何操作

最好是以一种在任何时候都知道状态的方式编写代码:只分配一次指针。如果您真的想在问题中使用该习惯用法,请使用智能指针(当它重置或超出范围时,它将为您执行删除操作):

std::auto_ptr a;
a、 重置(新的双(5));

你不能把第一个漏掉。每次你这么做都会漏掉一些东西。如果您必须有指针,请使用智能指针及其
重置
功能。@chris:智能指针的意义在于它会自动执行重置操作……因此,如果我不想泄漏,我必须在新建
新建
之前执行
删除
?在这种情况下,有一种方法可以知道指针是否没有分配任何东西(只指向空内存)?@TommasoFerrari,再次用智能指针和
if(p)
。更喜欢
std::make_shared
而不是
new
double *a = new double(5);
cout << *a << endl;
delete a; // note the delete

a = new double(10);
cout << *a;
delete a;
std::shared_ptr<double> p(new(10.0));
p.reset(new(5.0));
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.