2

可以在编译时(在堆栈上)分配 C++ 对象的内存。

MyClass mc;

或动态(常用方法)

MyClass *mc = new MyClass();

C++ 语言中是否有任何内置方法可以区分对象是以静态方式还是动态方式分配的?内置我的意思是使用模板或关键字等(非编程/算法方法)。

本质上,目标是“标记”未使用new运算符分配的对象(动态分配)。

4

2 回答 2

6

不,无法检测对象是静态分配还是动态分配。至少在大多数人使用这些词的意义上:堆栈与堆。C++ 标准考虑了三种类型的存储,静态存储(全局变量、类的静态成员、静态局部变量)、动态分配和自动存储。

第三个使事情复杂化,因为具有自动存储功能的对象可能被分配为可能在三个领域中的任何一个中分配的更大对象的一部分。例如,考虑一个在堆中分配并由 a 管理的对象shared_ptr,它可能是直接用 分配的new,或者它可能是通过创建的make_shared。在第一种情况下,new使用您的类型调用,但在后一种情况下,动态分配更大的块并就地构造对象:

std::shared_ptr<T> p = std::make_shared<T>();
std::shared_ptr<T> q( new T() );

现在有趣的一点是你为什么关心对象是如何创建的,因为可能有不同的事情可以解决你的实际问题,而不涉及你所要求的。

于 2013-04-10T01:42:22.773 回答
1

正如 StoryTeller 所说,您可能想要的是使new运算符重载。

class A{
    private:
        bool isDynamic;

    public:
        void *operator new(size_t size){
            isDynamic = true;
        }
于 2013-04-10T01:22:21.733 回答