1

我有以下类存储成对的日期和价格:

#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;
}

鉴于此设置,我将在哪里调用 delete 以释放在 loadData 函数中创建每个日期对象时分配的内存?我的第一个猜测是删除 A 的解构函数中的日期,但是如果传递给构造函数的日期要在 A 类之外的其他地方使用怎么办?

对此的任何帮助将不胜感激。

4

3 回答 3

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) { }
};

那么你就不必担心内存管理了。编译器将进行优化,以使上面的代码执行的副本比您想象的要少。

于 2012-04-19T07:45:33.620 回答
1

您可以使用 shared_ptr(来自 boost 或 tr1)进行自动内存清理:

vector<pair<boost::shared_ptr<date>, float> > prices;

我还建议prices在 loadData 中创建一个 std::vector,而不是一个数组。

于 2012-04-19T07:43:00.557 回答
1

将指针保存在容器中的最佳解决方案是使用boost::shared_ptr/ std::shared_ptr。然后,当它们的引用计数降至 0 时,它们将销毁包含的对象,您不必担心它发生在哪里。

于 2012-04-19T07:45:07.410 回答