快速内存分配/范围问题

时间:2011-01-14 17:18:02

标签: c++ class memory memory-management constructor

例如这个类:

class RTPIPv4Address{
     public:
           RTPIPv4Address(int a, int b);
}

愚蠢的问题,但是...我只是偶然发现了一个代码,它初始化了一个像这样的类实例,例如

RTPIPv4Address adr(2,2);

现在我想知道,这只是通常的

的另一种语法
RTPIPv4Address* adr = new RTPIPv4Address (2,2);

还是有其他影响?例如,由于缺少指针和new(),它是否像其他局部变量一样在堆栈上声明,然后在函数返回时被释放,或者它是否保存在堆上并因此保持不变?

提前致谢

3 个答案:

答案 0 :(得分:3)

这两个都构造了一个对象,但除此之外是非常不同的。堆栈上的第一个构造,堆上的第二个构造。应尽可能使用第一种形式。当且仅当您需要持久化对象时,才应使用第二种形式,或者它太大而无法放在堆栈上。在{是{+}}中,new根本不是对象创建的“常用”形式。

答案 1 :(得分:3)

是的,第一个例子是堆栈分配的,并且它将被调用析构函数,并在变量失去作用域后立即释放。对于局部变量,这通常在函数返回时发生,尽管您可以通过花括号强制它先丢失范围。

function 
{
    RTPIPv4Address adr(2,2);

    return; //adr loses scope and destructor is called    
}

这就是它通常在堆栈上分配的方式以及它失去范围的方式,但它也可能发生在其他地方。

function
{
    if (condition)
    {
        RTPIPv4Address adr(2, 2);

         //do stuff with adr

     } //adr loses scope and destructor is called

    //do more stuff

    return;

}

答案 2 :(得分:1)

第一个示例将堆栈分配您的对象。在堆上获取内容的唯一方法是通过new(显然,malloc或其他低级操作,例如mmap)。