3
typedef typedef struct _OBJTIME {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
} OBJTIME

OBJTIME objTime; //Note, this objTime is modified other function
OBJTIME ObjectParent::returnObjTime() const
{
    return objTime;
}

私の質問は:

  1. 別のクラスが returnObjTime() 関数を呼び出すと、次のようになります。

    OBJTIME t = objectP->returnObjTime()
    OBJTIME 構造体の新しいコピーが作成されると思いますか?

  2. 完了したら、変数「t」を削除する必要がありますか? メモリリークが発生しますか?

ありがとう。

4

5 に答える 5

6

いいえ、グローバルのコピーを返しています。コピーとグローバルobjTimeの両方にスコープに基づく期間があります。つまり、スコープが終了すると、それらは自動的にメモリから解放されます。

于 2013-01-02T15:54:01.083 に答える
5

はい、コピーですが、によって作成されたものnewではないため、作成する必要はありませんdelete

于 2013-01-02T15:55:27.897 に答える
4

回答 1: はい、関数呼び出しのスコープに基づいた有効期間で新しいコピーが作成されます。

回答 2: いいえ、new で作成していないものを削除する必要はありません。

于 2013-01-02T15:56:47.663 に答える
3

dynamically allocate手動で行う必要はありませんdelete。いいえ、ここでは漏れはありません。

ただし、あなたが言ったように、ここで多くのコピーを作成していますが、これは明らかにパフォーマンス面で悪い考えです.

オブジェクトの読み取り専用コピーを返したい場合は、次のようにすることができます。

const OBJTIME&
ObjectParent::returnObjTime() const
{
    return objTime;
}

次に、オブジェクトの重みが 100 バイトであろうと 100M バイトであろうと関係ありません。

于 2013-01-02T15:56:41.657 に答える
2

ここに答えがあります:

1 -戻り値メソッドによって値を返しています。戻り objTime; それをローカル変数に取り込むため、毎回新しいローカルコピー「t」になります。

2 -変数 "t"を削除することを心配する必要はありません。"t" のnew 演算子を使用してメモリを割り当てていないため、関数のスコープ外に出ると自動的に削除されます (ローカル変数のスコープは関数ブロック内にあります)。)。

削除は、次のようなことをする場合にのみ必要です:

OBJTIME *t = new OBJTIME
于 2013-01-02T16:17:39.870 に答える