当这个成员是指针时,如何保证模板类成员被正确释放?

con*_*ong 0 c++ pointers

有一个模板类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)

我的问题是如何确保没有内存泄漏,无论是否是指针

Vit*_*meo 6

如果T原始指针,则在"Modern C++"中,您应该假设它不拥有它指向的内存位置.如果你需要所有权语义,你应该使用像和那样的智能指针 - 那些自己清理后可以毫不费力地使用它们.std::unique_ptrstd::shared_ptrTA

如果你有一个你无法控制的原始指针并且拥有一些内存,那么你应该在将它传递给智能指针之前将其包装在内A.

tl; dr:T需要照顾自己的资源,你应该假设它.