Утечка памяти после удаления шаблона класса - PullRequest
0 голосов
/ 17 декабря 2011

Если у меня есть следующий класс:

// ComponentMan.h
class ComponentMan
{
public:
    template<class T>
    void CreateComponent<T>()
    {
        T* temp = new T();
        delete temp; // Memory leak?
    }
}
  • Вызывает ли удаление temp утечку памяти?
  • Потому что программа не знает размер Т?
  • Если так, как я могу избежать этого?

Ответы [ 2 ]

3 голосов
/ 17 декабря 2011

Здесь нет утечки памяти, потому что программа знает размер temp. Компилятор заменяет шаблонные параметры фактическими типами во время компиляции, поэтому при запуске программы она точно знает тип temp

1 голос
/ 17 декабря 2011

Во время удаления компилятор не знает размер объекта, на который указывает 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 работает, хотя нам не нужно напоминать компилятору о том, насколько великнаш массив целых чисел был.

(Изменить: чтобы уточнить, что мы говорим здесь о времени удаления. Компилятор знает больше во время создания, чем во время удаления. Вопрос в том, "как система узнает,во время удаления сколько памяти удалить? ". Один ответ на http://c -faq.com / malloc / freesize.html )

...