-1

次のクラスがある場合:

// ComponentMan.h
class ComponentMan
{
public:
    template<class T>
    void CreateComponent<T>()
    {
        T* temp = new T();
        delete temp; // Memory leak?
    }
}
  • temp を削除するとメモリ リークが発生しますか?
  • プログラムが T のサイズを知らないからですか?
  • もしそうなら、どうすればそれを避けることができますか?
4

2 に答える 2

3

プログラムはのサイズを知っているので、ここではメモリリークはありませんtemp。コンパイラは、コンパイル時にテンプレート化されたパラメータを実際の型に置き換えるため、プログラムを実行すると、その型が正確にわかります。temp

于 2011-12-17T16:50:17.253 に答える
1

削除時に、コンパイラは が指すオブジェクトのサイズを知りませtempが、知る必要がないため、リークはありません。例えば:

struct T { int t; };
struct U : public T { int u; };
T * temp = new U();
delete temp; // compiler doesn't know whether it's dealing with a T or a U

今のところ C++ のことは忘れて、単純に C について考えてみてください。

int * ptr = malloc(100);
free(ptr);

この C コードは機能しますが、int の配列の大きさをコンパイラに通知する必要はありません。

(編集:ここで削除時間について話していることを明確にするために。コンパイラは、削除時よりも作成時の方が多くのことを知っています。問題は、「システムは、削除時に、削除するメモリの量をどのように知るのですか?」. 1 つの答えはhttp://c-faq.com/malloc/freesize.htmlにあります) 。

于 2011-12-17T18:08:27.740 に答える