C++ 私有析构函数,但我可以手动删除VS2015中的对象

C++ 私有析构函数,但我可以手动删除VS2015中的对象,c++,visual-studio-2015,C++,Visual Studio 2015,VS2015编译器有什么问题吗?我一直认为,如果我声明a类私有/受保护的析构函数,我将无法手动销毁该对象,但在VS2015中,我可以轻松编译该代码: class X { public: template<class T> T* create(T v = T{}) { return new T{ v }; } X(){} private: ~X() {} }; int main() { X* x{new X};

VS2015编译器有什么问题吗?我一直认为,如果我声明a类私有/受保护的析构函数,我将无法手动销毁该对象,但在VS2015中,我可以轻松编译该代码:

class X
{
public:
    template<class T>
    T* create(T v = T{})
    {
        return new T{ v };
    }
    X(){}
private:
    ~X() {}

};

int main()
{
    X* x{new X};
    auto i{ x->create<int>() };
    auto d{ x->create<double>(2) };
    delete i;
    delete d;
    return 0;
}
X类
{
公众:
模板
T*create(tv=T{})
{
返回新的T{v};
}
X(){}
私人:
~X(){}
};
int main()
{
X*X{new X};
自动i{x->create()};
自动d{x->创建(2)};
删除i;
删除d;
返回0;
}

您的X类是一个模板化的工厂类。它创建T类型的对象,在您的例子中是int*和double*

然后初始化一个int*和double*指针,指向工厂返回的值,这意味着调用delete的2个新对象


您从不对x本身调用delete,而是对x::create(意思是i和d)返回的对象调用delete。

您使用
x->create
方法创建
int
double
,然后删除它们

int
double
没有析构函数;没有理由不能删除它们


x
有一个私有析构函数,但您不能在代码中的任何地方删除x。

在您的程序中,您不能调用类x的析构函数。如果您编写表达式

delete x;
程序将无法编译

考虑一个更简单的例子

class X
{
    ~X() {}
};    


int main()
{
    X x;

    return 0;
}

编译器不会编译该程序,因为该类的析构函数是私有的,应该在main的末尾调用它。

但您不会在代码中的任何地方手动销毁该对象。。。你的意思是让
删除x在某处?添加
删除x
查看问题。@RSahu当然是我的!谢谢你,伙计!