vector 破坏对象但不构造它们的替代品?
vector destroys objects but does not construct their replacements?
#include <iostream>
#include <vector>
using namespace std;
class cMember
{
public:
int id;
cMember();
~cMember();
};
cMember::cMember()
{
cout<<"member constructor\n";
}
cMember::~cMember()
{
cout<<"member destructor\n";
};
class cDirectory
{
std::vector<cMember> memberList;
public:
cDirectory();
~cDirectory();
void Populate();
};
cDirectory::cDirectory()
{
cout<<"directory constructor\n";
}
cDirectory::~cDirectory()
{
cout<<"directory desctructor\n";
}
void cDirectory::Populate()
{
for(int i = 0; i < 2; i++)
{
cout<<"A\n";
cMember t;
memberList.push_back(t);
cout<<"B\n";
}
cout<<"C\n";
}
int main( int argc, const char ** argv )
{
cDirectory dir;
dir.Populate();
exit(0);
}
查看这个程序的输出,第二次迭代调用 A 和 B 之间的成员析构函数。我假设这个调用是向量重新分配和重新填充,并销毁重新分配之前它拥有的成员。
vector 怎么会破坏对象,而不是构造它们的替代品?
How can vector be destroying objects, but not constructing their
replacements?
它通过调用对象的复制构造函数而不是用户定义的默认构造函数来构造它们。
也就是说,如果您不为对象定义一个复制构造函数,编译器将为您隐式定义一个。这里也是如此。当你的向量缓冲区被重新分配时,每个对象的复制构造函数都会被调用,以便将对象复制到它们的新位置。如果您按如下方式定义复制构造函数,您可以看到这一点:
class cMember {
public:
int id;
cMember();
CMember(cMember const&);
^^^^^^^^^^^^^^^^^^^^^^^^
~cMember();
};
cMember::cMember(cMember const &) {
cout<<"member copy constructor\n";
}
因为cMember
是静态分配的,当函数超出范围时,内存就会丢失。如果 vector 仍然引用内存中的那个点,这对 vector 来说会有问题。因此,std::vector
将复制构造该对象。这为向量提供了它自己的动态分配副本,即使在函数超出范围后,该副本仍将存在于向量中。
我也修改了您的代码以打印 this
,这是输出:
directory constructor
A
member constructor 0x7fff572e86f8
B
member destructor 0x7fff572e86f8
A
member constructor 0x7fff572e86f8
member destructor 0x7fc1dbc04c80
B
member destructor 0x7fff572e86f8
C
如您所见,A和B之间被销毁的对象不是您的函数构造的。相反,它是 std::vector
.
使用的复制构造对象
#include <iostream>
#include <vector>
using namespace std;
class cMember
{
public:
int id;
cMember();
~cMember();
};
cMember::cMember()
{
cout<<"member constructor\n";
}
cMember::~cMember()
{
cout<<"member destructor\n";
};
class cDirectory
{
std::vector<cMember> memberList;
public:
cDirectory();
~cDirectory();
void Populate();
};
cDirectory::cDirectory()
{
cout<<"directory constructor\n";
}
cDirectory::~cDirectory()
{
cout<<"directory desctructor\n";
}
void cDirectory::Populate()
{
for(int i = 0; i < 2; i++)
{
cout<<"A\n";
cMember t;
memberList.push_back(t);
cout<<"B\n";
}
cout<<"C\n";
}
int main( int argc, const char ** argv )
{
cDirectory dir;
dir.Populate();
exit(0);
}
查看这个程序的输出,第二次迭代调用 A 和 B 之间的成员析构函数。我假设这个调用是向量重新分配和重新填充,并销毁重新分配之前它拥有的成员。
vector 怎么会破坏对象,而不是构造它们的替代品?
How can vector be destroying objects, but not constructing their replacements?
它通过调用对象的复制构造函数而不是用户定义的默认构造函数来构造它们。
也就是说,如果您不为对象定义一个复制构造函数,编译器将为您隐式定义一个。这里也是如此。当你的向量缓冲区被重新分配时,每个对象的复制构造函数都会被调用,以便将对象复制到它们的新位置。如果您按如下方式定义复制构造函数,您可以看到这一点:
class cMember {
public:
int id;
cMember();
CMember(cMember const&);
^^^^^^^^^^^^^^^^^^^^^^^^
~cMember();
};
cMember::cMember(cMember const &) {
cout<<"member copy constructor\n";
}
因为cMember
是静态分配的,当函数超出范围时,内存就会丢失。如果 vector 仍然引用内存中的那个点,这对 vector 来说会有问题。因此,std::vector
将复制构造该对象。这为向量提供了它自己的动态分配副本,即使在函数超出范围后,该副本仍将存在于向量中。
我也修改了您的代码以打印 this
,这是输出:
directory constructor
A
member constructor 0x7fff572e86f8
B
member destructor 0x7fff572e86f8
A
member constructor 0x7fff572e86f8
member destructor 0x7fc1dbc04c80
B
member destructor 0x7fff572e86f8
C
如您所见,A和B之间被销毁的对象不是您的函数构造的。相反,它是 std::vector
.