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

この設定では、loadData 関数で各日付オブジェクトを作成するときに割り当てられたメモリを解放するために、どこで delete を呼び出すでしょうか? 私の最初の推測は、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 に答える