区分C ++对象是否动态分配?

时间:2013-04-10 01:08:53

标签: c++ memory-management

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

MyClass mc;

或动态(常用方法)

MyClass *mc = new MyClass();

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

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

2 个答案:

答案 0 :(得分:6)

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

这是第三个使事情变得复杂的事情,因为具有 auto 存储的对象可能被分配为可能在三个竞技场中的任何一个中分配的较大对象的一部分。例如,考虑在堆中分配并由shared_ptr管理的对象,它可能已直接与new一起分配,或者可能是通过make_shared创建的。在第一种情况下,使用您的类型调用new,但在后者中,动态分配更大的块并且对象构造到位:

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

现在有趣的一点是为什么你关心对象的创建方式,因为可能有不同的事情可以解决你真正的问题涉及你要求的东西。

答案 1 :(得分:1)

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

class A{
    private:
        bool isDynamic;

    public:
        void *operator new(size_t size){
            isDynamic = true;
        }