我想了解以下(讓我們假裝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();
}
從我understading,當s
返回向量,並分配給vm
這是爲完成一份副本(按價值)。因此,如果s
超出範圍並將其稱爲析構函數,則vm
擁有自己的副本,並且其結構不受影響。但是,傳遞價值並不高效。所以,如果你改變它按引用傳遞:
vector<MyStorageClass*>& getItems()
{
for(int i = 0; i < 10; ++i)
{
v.push_back(new MyStorageClass());
}
return v;
}
您傳遞的v
的存儲位置(在課堂上存儲)。但是您仍然使用=
運算符將它的副本分配給Main類中的矢量vm
。因此,vm
獨立於v
,並且如果Storage
析構函數被調用vm
不受影響。
最後,如果getItems
返回的引用,在主你有以下幾點:
main()
{
storage s;
vector<MyStorageClass*> &vm = s.getItems();
}
現在,vm
持有v
地址。所以它受存儲析構函數影響。
問題:我上面說過的是真的嗎?
聲音對我來說是正確的。沒有一個答案,因爲我沒有正式覈實。 –
找不到這個:) :) – LiMuBei
'myVec'沒有在任何地方聲明。 '〜存儲'中是否指'v'? – outis