C++ 更新指针?
这是一件不该做的事,还是正确的?事实上,在一个指针上多次使用new: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 <
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.