【问题标题】:Quick memory allocation / scope question快速内存分配/范围问题
【发布时间】:2011-01-14 17:18:01
【问题描述】:

例如这个类:

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

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

RTPIPv4Address adr(2,2);

现在我想知道,这只是通常的另一种语法吗

RTPIPv4Address* adr = new RTPIPv4Address (2,2);

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

提前致谢

【问题讨论】:

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


【解决方案1】:

是的,第一个示例是堆栈分配的,一旦变量失去作用域,就会调用它的析构函数并释放它。对于局部变量,这通常发生在函数返回时,尽管您可以使用花括号强制它提前失去作用域。

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】:

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

    【讨论】:

    • +1 此外,当我们使用new 时,它直接进入智能指针,从未手动使用过。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 2021-03-09
      • 1970-01-01
      • 2012-04-16
      • 2018-01-10
      • 1970-01-01
      • 2012-12-26
      相关资源
      最近更新 更多