C++ 如何判断对象是静态还是动态地分配给构造函数?

C++ 如何判断对象是静态还是动态地分配给构造函数?,c++,constructor,memory-management,C++,Constructor,Memory Management,可能重复: 我有一个对象,无论它的实例是静态分配还是动态分配,它都需要稍微不同的构造。 对象应该只有一个默认构造函数。因此,有两个构造函数,每种情况一个,让用户显式地选择合适的构造函数是不可能的 有没有合适的方法来实现这一点 我现在就是这样做的: 我重载该对象的新操作符malloc内存,并使用返回的指针作为指向尚未初始化实例的指针,并将该对象的特定数据成员设置为某个神奇值。 然后,在consuctor中,我检查成员的值。如果是魔法值,那么对象是99.9%动态分配的 在relase和debug模

可能重复:

我有一个对象,无论它的实例是静态分配还是动态分配,它都需要稍微不同的构造。 对象应该只有一个默认构造函数。因此,有两个构造函数,每种情况一个,让用户显式地选择合适的构造函数是不可能的

有没有合适的方法来实现这一点

我现在就是这样做的: 我重载该对象的新操作符malloc内存,并使用返回的指针作为指向尚未初始化实例的指针,并将该对象的特定数据成员设置为某个神奇值。 然后,在consuctor中,我检查成员的值。如果是魔法值,那么对象是99.9%动态分配的


在relase和debug模式下,这种方法对我来说都没有失败,但是,它似乎是一种可怕的攻击。

任何构造函数都可以用于静态或动态分配。您无法强制对象的用户使用特定的构造函数,无论他以何种方式分配对象。

您应该能够实现您想要的,同时保留一个可供单个用户访问的默认构造函数,该构造函数将用于静态和自动对象-您似乎忽略了自动对象的存在,例如,局部变量,因此我认为您希望以相同的方式处理这些情况

使操作符new和单独的构造函数都私有,并使其成为公共静态方法这是工厂方法设计模式的一个例子,它只返回新的类123;假设单独的构造函数以整数为例,但是您当然可以选择任何类型的参数,因为该参数无论如何都不会被使用


您知道您说过对象应该有一个构造函数,但是从用户的角度来看,类的行为正是这样,用户没有显式选择构造函数,他只是不能显式调用new,但必须通过您提供的工厂方法,就这些。

我想你在构造器里看不出来


我不知道这是否有帮助,但是可以通过将析构函数设置为私有来防止静态创建对象。您还需要有一个公共的Delete方法来为动态分配此类对象的代码执行Delete-this操作-他们必须执行obj->Delete而不是Delete-obj操作。

不,您必须接受您的攻击。唯一正确的方法就是修改你的设计。我不确定我是否明白。您的意思是用户必须调用静态函数才能分配新实例而不是使用新实例吗?如果这就是你的意思,那为什么还要让新的东西超载呢?无论如何,这是不行的,因为类需要继承,并且通过您的方法,每个子类还应该定义自己的静态函数。*正如您所提到的,自动对象被视为静态对象。创建新的私有对象会阻止用户只调用新的Foo,否则它们可能会调用新的Foo。是的,如果所有生活在动态存储中的Foo对象(包括基类或成员)都需要特殊处理,那么我的建议要求其他类也这样做——但是您提出的解决方案没有更好的效果-这在基类中根本不起作用。私有析构函数将阻止子类对象永远存在。可以从其子类调用受保护的基类析构函数,这意味着可以在堆栈上生成子类。除非子类也限制其dtor可见性。无论哪种方式,基类上受保护的dtor都是无用的。