【发布时间】:2011-12-01 13:35:52
【问题描述】:
我正在尝试理解以下内容(假设 MyStorageClass 很大):
class MyStorageClass
{
public:
string x;
string y;
string z;
};
class storage
{
public:
storage();
~storage()
{
vector<MyStorageClass *>::iterator it = myVec.begin(); it != myVec.end(); it++)
{
delete *it;
}
vector<MyStorageClass*> getItems()
{
for(int i = 0; i < 10; ++i)
{
v.push_back(new MyStorageClass());
}
return v;
}
private:
vector<MyStorageClass*> v;
};
main()
{
storage s;
vector<MyStorageClass*> vm = s.getItems();
}
据我了解,当s 返回向量并分配给vm 时,这是作为副本(按值)完成的。因此,如果s 超出范围并将其称为析构函数,则vm 拥有自己的副本,并且其结构不受影响。但是,按值传递效率不高。因此,如果您将其更改为通过引用传递:
vector<MyStorageClass*>& getItems()
{
for(int i = 0; i < 10; ++i)
{
v.push_back(new MyStorageClass());
}
return v;
}
您传递了v 的内存位置(在Storage 类中)。但是您仍然使用 = 运算符将其副本分配给 Main 类中的向量 vm。所以,vm 独立于v,如果Storage 析构函数调用vm 不受影响。
最后,如果 getItems 返回了一个引用,并且在 main 中你有以下内容:
main()
{
storage s;
vector<MyStorageClass*> &vm = s.getItems();
}
现在,vm 拥有v 的地址。所以它受Storage析构函数的影响。
问题:我上面所说的是真的吗?
【问题讨论】:
-
听起来对我来说是正确的。不是一个答案,因为我还没有正式验证。
-
找不到任何问题:)
-
myVec没有在任何地方声明。您是说~storage中的v吗?
标签: c++ memory-management pointers