有一个模板类A:
template<typename T>
class A {
public:
T t;
A(T t) {
this->t = t;
cout << "A constructor" << endl;
}
~A() {
cout << "A destructor" << endl;
}
};
Run Code Online (Sandbox Code Playgroud)
t是A类的成员,如果t是指向动态分配的内存的指针,那么默认的析构函数不能释放它,例如:
A<SomeType*> a(new SomeType());
Run Code Online (Sandbox Code Playgroud)
因为我们不知道t是否是指针,所以我们不能像这样做解构函数:
~A() {
delete t;
cout << "A destructor" << endl;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何确保没有内存泄漏,无论是否是指针
如果T是原始指针,则在"Modern C++"中,您应该假设它不拥有它指向的内存位置.如果你需要所有权语义,你应该使用像和那样的智能指针 - 那些自己清理后可以毫不费力地使用它们.std::unique_ptrstd::shared_ptrTA
如果你有一个你无法控制的原始指针并且拥有一些内存,那么你应该在将它传递给智能指针之前将其包装在内A.
tl; dr:T需要照顾自己的资源,你应该假设它.