更新指针?

时间:2013-07-03 21:43:17

标签: c++ pointers new-operator

是不是做了,或者是对的?事实是在一个指针上多次使用新的东西:

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

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

感谢。

解: 所以一种可能的解决方案是?!

 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.

5 个答案:

答案 0 :(得分:2)

不行 - 首先分配的内存会泄漏。但主要原因是它不是惯用的C ++。普通的

有什么问题
double a;
a = 5;
cout << a << endl;

a = 10;
cout << a;

答案 1 :(得分:2)

不,这会导致内存泄漏。 每个 new都需要相应的delete

答案 2 :(得分:2)

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

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

在这种情况下,您可能希望使用类似

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

然后您可以将其更新为

p.reset(new(5.0));

答案 3 :(得分:2)

在回答你的后续问题时,(你怎么确定你没有删除空指针):没关系。 delete null什么也没做。

最好以一种在任何时候都知道状态的方式编写代码:只指定一次指针。如果你真的想在你的问题中使用这个成语,请使用一个智能指针(当你重置或超出范围时,它会为你做删除):

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.

答案 4 :(得分: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;