在下面的测试用例中,我很困惑为什么析构函数似乎没有被调用,即使我明确地调用它。我注意到只有在模板类型是指针时才会发生这种情况。
代码(内存泄漏,但我试图让最小的例子成为可能)
#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
答案 0 :(得分:5)
析构函数被调用。这不是你想到的析构函数。基本上,你有这个:
int main() {
using T = A*;
T* arr = new T[1];
arr[0]->~T();
}
但是T
是A*
,所以你的调用的析构函数是指针析构函数 - 这是微不足道的 - 而不是你的类的析构函数。您的TemplateTest<A*> pt
对象实际上不会创建A
的任何实例 - 仅A*
的实例。