删除模板类后内存泄漏

时间:2011-12-17 16:45:00

标签: c++ templates template-meta-programming

如果我有以下课程:

// ComponentMan.h
class ComponentMan
{
public:
    template<class T>
    void CreateComponent<T>()
    {
        T* temp = new T();
        delete temp; // Memory leak?
    }
}
  • 删除temp会导致内存泄漏吗?
  • 因为节目不知道T的大小?
  • 如果是这样,我该如何避免呢?

2 个答案:

答案 0 :(得分:3)

这里没有内存泄漏,因为程序知道temp大小。编译器在编译时使用实际类型替换模板化参数,因此在程序运行时它确切地知道temp的类型

答案 1 :(得分: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代码有效,即使我们不必提醒编译器我们的整数数组有多大。

(编辑:澄清我们在这里谈论删除时间。编译器在创建时比在删除时知道更多。问题是“在删除时,系统如何知道要删除多少内存?“。答案是http://c-faq.com/malloc/freesize.html