如果我有以下课程:
// ComponentMan.h
class ComponentMan
{
public:
template<class T>
void CreateComponent<T>()
{
T* temp = new T();
delete temp; // Memory leak?
}
}
答案 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)