我有以下课程,存储成对的日期和价格:
#include <vector>
#include <utility>
#include "boost/date_time/gregorian/gregorian.hpp"
using std::vector;
using std::pair;
using boost::gregorian::date;
class A {
private:
vector<pair<date*, float> > prices;
public:
A(pair<date*, float> p[], int length) : prices(p, p + length) { }
};
使用以下函数创建并填充此类的对象:
A loadData() {
// create price array
pair<date*, float> *prices = new pair<date*, float>[10];
// fill array with data (normally read from a file)
for (int i = 0; i < 10; ++i) {
prices[i].first = new date(2012, 4, 19);
prices[i].second = 100;
}
// create the object using the price array
A result(prices, 10);
// delete the price array (its contents have been moved to result's vector)
delete[] prices;
return result;
}
鉴于此设置,在loadData函数中创建每个日期对象时,我将在何处调用delete来释放分配的内存?我的第一个猜测是删除A的解构函数中的日期,但是如果传递给构造函数的日期要在A类之外的其他地方使用呢?
非常感谢任何帮助。
答案 0 :(得分:7)
除非你有充分的理由这样做,否则请忘记指示:
A loadData() {
// create price array
vector<pair<date, float> > prices;
// fill array with data (normally read from a file)
for (int i = 0; i < 10; ++i) {
prices.push_back(make_pair(date(2012, 4, 19), 100));
}
// create and return the object using the price array
return result(prices);
}
并相应地修改该类:
class A {
private:
vector<pair<date, float> > prices;
public:
explicit A(const std::vector<pair<date, float> >& p) : prices(p) { }
};
然后您不必担心内存管理。编译器将进行优化,使上面的代码执行的副本少于您想象的。
答案 1 :(得分:1)
您可以使用shared_ptr(来自boost或tr1)进行自动内存清理:
vector<pair<boost::shared_ptr<date>, float> > prices;
我还建议在loadData中使prices
成为std :: vector,而不是数组。
答案 2 :(得分:1)
将指针保留在容器中的最佳解决方案是使用boost::shared_ptr
/ std::shared_ptr
。然后,当它们的引用计数降到0时,它们将销毁包含的对象,并且您不必担心它发生的位置。