删除模板类后内存泄漏

Memory leak after deleting template class

本文关键字:内存 泄漏 删除      更新时间:2023-10-16

如果我有以下类:

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

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

的类型。

在删除时,编译器不知道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数组有多大。

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