Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除模板类后内存泄漏_C++_Templates_Template Meta Programming - Fatal编程技术网

C++ 删除模板类后内存泄漏

C++ 删除模板类后内存泄漏,c++,templates,template-meta-programming,C++,Templates,Template Meta Programming,如果我有以下课程: // ComponentMan.h class ComponentMan { public: template<class T> void CreateComponent<T>() { T* temp = new T(); delete temp; // Memory leak? } } 删除临时文件是否会导致内存泄漏? 因为程序不知道t的大小? 如果是这样的话,我怎样才能避免呢? 这里

如果我有以下课程:

// ComponentMan.h
class ComponentMan
{
public:
    template<class T>
    void CreateComponent<T>()
    {
        T* temp = new T();
        delete temp; // Memory leak?
    }
}
删除临时文件是否会导致内存泄漏? 因为程序不知道t的大小? 如果是这样的话,我怎样才能避免呢?
这里并没有内存泄漏,因为程序知道温度的大小。编译器在编译时用实际类型替换模板参数,因此当程序运行时,它确切地知道删除时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.</P>

int * ptr = malloc(100);
free(ptr);
这段C代码可以工作,即使我们不必提醒编译器我们的int数组有多大


编辑:为了澄清我们在这里讨论的是删除时间。编译器在创建时比删除时知道的更多。问题是,在删除时,系统如何知道要删除多少内存?。一个答案是

如果它不知道对象的大小,它怎么可能一开始就处理新的呢?@BenjaminLindley:你应该这样回答!这与模板没有任何关系。这个问题本质上只是问free如何工作。实际上,编译器通常不知道大小。但它不需要知道大小。这是一个如何在较低级别处理内存的问题。例如,如果T*temp=newu;其中U扩展T,然后删除temp;不知道它处理的是t还是U。删除时不应该显式地告诉所指对象的大小,这并不意味着编译器可以在不使用KNW大小的情况下工作。编译器必须知道为对象分配内存的大小。问题是询问删除,以及删除代码如何“知道”大小。问题不在于创造物如何知道大小。不!你为什么这么认为?问题实际上是“模板如何工作”:我认为,作者不会给我们模板代码,如果他在理解“如何删除工作”方面有问题,我认为提问者真的不知道他们在问什么问题。我仍然看不到模板和这个问题之间的任何联系。如果堆栈上没有任何new或delete,而temp是T类型的值,而不是T*,则模板可能更相关。你明白我的意思了吗?