为什么析构函数在expicitly调用时不会被模板化指针调用?

时间:2015-05-24 00:05:50

标签: c++ templates destructor

在下面的测试用例中,我很困惑为什么析构函数似乎没有被调用,即使我明确地调用它。我注意到只有在模板类型是指针时才会发生这种情况。

代码(内存泄漏,但我试图让最小的例子成为可能)

#include <iostream>
using namespace std;

class A {
public:
    A() {}
    ~A() { cout << "A Destructor"; }
};

template<typename Type>
class TemplateTest {
protected:
    Type* start;
    Type* end;
    Type* iter;
public:
    void Generate(unsigned int count) {
        start = new Type[count];
        end = start + count;
        iter = start;
    }
    void DestroyAll() {
        for(; start < end; ++start) {
            (*start).~Type();
        }
    }
    void Push(Type val) {
        *iter = val;
        iter++;
    }
};

int main() {
    cout << "Non-pointer test" << endl;
    TemplateTest<A> npt;
    npt.Generate(5);
    npt.DestroyAll();

    cout << "\nPointer test";
    TemplateTest<A*> pt;
    pt.Generate(5);
    pt.Push(new A());
    pt.DestroyAll();

    return 0;
}

输出

Non-pointer test
A DestructorA DestructorA DestructorA DestructorA Destructor
Pointer test

正在运行示例:https://ideone.com/DB70tF

1 个答案:

答案 0 :(得分:5)

析构函数调用。这不是你想到的析构函数。基本上,你有这个:

int main() {
    using T = A*;
    T* arr = new T[1];
    arr[0]->~T();
}

但是TA*,所以你的调用的析构函数是指针析构函数 - 这是微不足道的 - 而不是你的类的析构函数。您的TemplateTest<A*> pt对象实际上不会创建A的任何实例 - 仅A*的实例。