Ответ 1
Это эквивалентно:
(((((delete p1),p2),p3),p4),p5);
То есть, это delete
p1
, а затем к результату (который не существует) и p2
применяется оператор запятой. Выражения p2
до p5
просто оцениваются и результаты отбрасываются.
Удаляет ли это все указатели или просто удаляет первый указатель p1?
delete p1,p2,p3,p4,p5;
Это эквивалентно:
(((((delete p1),p2),p3),p4),p5);
То есть, это delete
p1
, а затем к результату (который не существует) и p2
применяется оператор запятой. Выражения p2
до p5
просто оцениваются и результаты отбрасываются.
Поскольку ',' является оператором запятой, очевидно, что только первый объект, на который указывает, удаляется, а остальные выражения вычисляются и результаты отбрасываются:
class A{
public:
string name_;
A(){}
A(string name):name_(name){}
~A(){cout<<"~A"<<name_;}
};
int main(){
A* a1=new A("a1");
A* a2=new A("a2");
delete a1, a2;
cout<<"\n.....\n";
delete a2, a1;
//...
выход:
~ Aa1
....
~ Аа2
Он удаляет первый.
Оператор запятой оценивает то, что перед запятой затем отбрасывает.