0

私は単純なレイ トレーサーに取り組んでいますが、メモリ不足の問題が発生しています。Visual Studio 用の Visual Leak Detector をダウンロードしたところ、次の関数がメモリ リークを引き起こしていることがわかりました。ただし、これらがリークと見なされる理由はわかりません。

Point* Point::copy() {

    Point* result = new Point(x, y, z);

    return result;
}

Point* Point::crossProduct(Point* other) {

    double crossX = y*(*other).getZ() - z*(*other).getY();
    double crossY = z*(*other).getX() - x*(*other).getZ();
    double crossZ = x*(*other).getY() - y*(*other).getX();

    Point* cross = new Point(crossX, crossY, crossZ);

    return cross;
}

ここに示すコピー関数を作成して使用した後、コピー コンストラクターについて初めて発見したことに注意してください。プロジェクトをやり直す場合は、代わりにコピー コンストラクターを使用します。関数を使用するときは、使用している変数に対して必ず「削除」を呼び出します。例えば:

Point* n = AB.crossProduct(&AC);
...
delete n;

これでメモリリークを処理する必要があると考えるのは間違っていますか? Visual Leak Detector は、別のファイルにあるため、リークが処理されたことを認識できないのでしょうか?

4

3 に答える 3

5

値で返して const 参照で渡さないのはなぜですか?

Point Point::copy() 
{
    return Point(x, y, z);
}

Point Point::crossProduct(const Point& other)
{
    double crossX = y * other.getZ() - z * other.getY();
    double crossY = z * other.getX() - x * other.getZ();
    double crossZ = x * other.getY() - y * other.getX();

    return Point(crossX, crossY, crossZ);
}

もちろん、あなたのcopy関数はただの貧乏人のコピーコンストラクタ/代入演算子なので、代わりにそれらを使用してください:

Point::Point(const Point& other) 
    : x(other.x)
    , y(other.y)
    , z(other.z)
{
}

Point& Point::operator=(const Point& other) 
{
    x = other.x;
    y = other.y;
    z = other.z;
    return *this;
}
于 2014-09-23T03:16:09.387 に答える
4

ルールは次のとおりです。
すべての動的メモリ割り当てには、対応する割り当て解除が必要です。

このルールに従わないと、メモリ リークが発生します。少なくとも、メモリ リーク検出ツールのいずれかがそれらを検出します。プログラムの存続期間が終了するまで割り当てが解除されないメモリ割り当てが存在する可能性がありますが、これらのインスタンスはごくわずかです。そして、その概念を本当によく理解していない限り、それらに手を出すべきではありません.

メモリの割り当て/割り当て解除を取得する最も簡単な方法は、単にスマート ポインターを使用することです。

注:はい、あなたが示したコードに基づいて、あなたの取り扱いは正しいようです。

于 2014-09-23T03:01:00.097 に答える
1

メモリを手動で管理するのではなく、スマート ポインターを使用します。このようにして、すべてのオブジェクトが自動的に割り当て解除され、メモリ リークを心配する必要がなくなります。

于 2014-09-23T03:01:43.840 に答える