2011-12-17 8 views
-1

を削除した後:メモリリークは、テンプレートクラス

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

いいえありません。 N/A。 –

+1

オブジェクトのサイズがわからない場合は、最初に 'new'をどのように処理できましたか? – Mat

+0

@BenjaminLindley:あなたはそれを答えるべきです! –

答えて

1

の種類を知っている、コンパイル時に実際の型とのparamsをテンプレート化コンパイラの代替、コンパイラはないをしてオブジェクトのサイズを知っている「tempで指さが、それはdoesnの知っている必要があり、したがって漏れはありません。たとえば:

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++を忘れる、と単純に我々はint型のコンパイラどれほど私たちの配列を思い出させるために持っていないにもかかわらず、C.このCのコードが動作

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

を考えますありました。

(編集:私たちがここで削除時間について話していることを明確にするために、コンパイラーは削除時よりも作成時に多くのことを知っています。 1つの答えはhttp://c-faq.com/malloc/freesize.htmlです)

3

プログラムtempサイズを知っているので、ここにはメモリリークではありません。削除時にプログラムが実行されるときに、それは正確にtemp

+0

実際、コンパイラはしばしばサイズを知らない。しかし、サイズを知る必要はありません。これは、より低いレベルでのメモリの扱い方の問題です。たとえば、 'T * temp = new U();' UがTを延長する場合、 'delete temp;'はTまたはUを扱うかどうかを知らない。 –

+0

明示的に'delete'-ingがコンパイラがknwingサイズなしで動作できることを意味するわけではありません。コンパイラ_オブジェクトのメモリを_allocate_するためのサイズを知っている必要があります。 – Lol4t0

+0

質問は削除について質問し、削除コードがどのようにサイズを知ることができるかを尋ねています。問題は、創造物がどのようにサイズを知っているか尋ねるものではありません。 –

関連する問題