是不是做了,或者是对的?事实是在一个指针上多次使用新的东西:
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.
答案 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;