64,654
社区成员
发帖
与我相关
我的任务
分享
#include <vector>
#include <iostream>
using namespace std;
class Cls
{
public:
Cls(int x):m(x)
{
cout <<"ctor: " <<m <<endl;
}
Cls(const Cls& c):m(c.m*10)
{
cout <<"copy: " <<m <<endl;
}
~Cls()
{
cout <<"dtor: " <<m <<endl;
}
private:
int m;
};
int main()
{
{
vector<Cls> vec;
vector<Cls*> p_vec;
Cls c1(1);
Cls c2(2);
Cls c3(3);
vec.push_back(c1);
vec.push_back(c2);
vec.push_back(c3);
Cls *p1=new Cls(4);
Cls *p2=new Cls(5);
Cls *p3=new Cls(6);
p_vec.push_back(p1);
p_vec.push_back(p2);
p_vec.push_back(p3);
for(int i=0;i<(int)p_vec.size();++i)
delete p_vec[i];
}
return 0;
}
ctor: 1
ctor: 2
ctor: 3
copy: 10
copy: 20
copy: 100
dtor: 10
copy: 30
copy: 1000
copy: 200
dtor: 100
dtor: 20
ctor: 4
ctor: 5
ctor: 6
dtor: 4
dtor: 5
dtor: 6
dtor: 3
dtor: 2
dtor: 1
dtor: 1000
dtor: 200
dtor: 30
请按任意键继续. . .
1
1
2
1000
2000
3000
3
2
1
1
2
3
输出结果为什么会是这样啊?#include <vector>
#include <iostream>
using namespace std;
class Cls
{
public:
Cls(int x):m(x)
{
}
~Cls()
{
cout <<m <<endl;
}
int m;
};
int main()
{
vector<Cls> vec;
vector<Cls*> p_vec;
Cls c1(1);
Cls c2(2);
Cls c3(3);
vec.push_back(c1); // 扩容,无对象可析构
vec.push_back(c2); // 扩容,c1析构
vec.push_back(c3); // 再次扩容,c1,c2析构
Cls *p1=new Cls(1000);
Cls *p2=new Cls(2000);
Cls *p3=new Cls(3000);
p_vec.push_back(p1); // 扩容,无对象可析构
p_vec.push_back(p2); // 扩容,仍无对象可析构
p_vec.push_back(p3); // 扩容,仍无对象可析构
// 在这之前,只输出1 1 2,c1,c2对象会析构
// 但指针变量p1,p2指向的对象不会被析构
// 扩容只导致指针变量被拷贝,这不影响其指向的对象
for(int i=0;i<(int)p_vec.size();++i)
delete p_vec[i];
//delete p1; // 错误,因为Cls(1000)已经delete掉
// 如果检测到内存泄露,那只是检测工具的误判
return 0;
}