2

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

 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.
4

5 回答 5

2

不行——第一个分配的内存会泄漏。但主要原因是它不是惯用的 C++。普通旧有什么问题

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

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

不,这会导致内存泄漏。 new一个都需要一个对应的delete.

于 2013-07-03T21:45:15.573 回答
2

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

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

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

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

然后您可以将其更新为

p.reset(new(5.0));
于 2013-07-03T21:49:10.783 回答
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.
于 2013-07-03T21:51:14.180 回答
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 回答