我有一個相當簡單的問題,但無法將其包裹在頭上。在堆和堆棧上創建混合矢量對象
考慮我有這樣的代碼:
#include <iostream>
#include <vector>
using namespace std;
class B
{
public:
B(const int& val) {this->val = val;}
int val;
};
class A
{
public:
A() {}
void Set(B& ptb)
{
ptBs.push_back(&ptb);
}
void Set(const int& val)
{
ptBs.push_back(new B(val));
}
std::vector<B*> ptBs;
};
int main()
{
A* ptA = new A();
ptA->Set(B(10));
ptA->Set(38);
for (int i=0; i<ptA->ptBs.size(); i++)
cout << ptA->ptBs[i]->val << endl;
delete ptA;
system("pause");
return 0;
}
輸出結果是:
10
38
但我認爲有內存泄漏是怎麼回事在void Set(const int& val)
,如果我不會打電話與數組中刪除元素,由此方法創建。
我怎麼能說,這的std ::向量已經在堆上創建的元素,所以我可以在〜A()析構函數像這樣釋放內存:
~A()
{
for (int i=0; i<ptBs.size(); i++)
delete ptBs[i];
}
,做我必須刪除矢量元素,是否通過臨時性的新操作呼叫創建?
也許我在這裏看不到很簡單的東西,但我真的需要在我的應用程序中使用此功能。
PS。 10和38只是一個簡單的例子。使用不同的參數可以調用數千次函數來調用函數Set
。
這不是一個解構,它的析構函數。 – bash0r 2013-02-08 13:57:16
你可以使用'std :: pair'來表示哪些元素是堆分配的。在析構函數中,您可以執行'if(ptBs [i] .first)delete ptBs [i] .second;' –
bash0r
2013-02-08 14:00:52
讓您的生活變得簡單 - 選擇一個或另一個。 – 2013-02-08 14:18:00