2011-01-14 88 views
0

例如这个类:快速内存分配/范围问题

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

愚蠢的问题,但...我只是偶然在其初始化类实例一样,利用例如

RTPIPv4Address adr(2,2); 

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

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

或者它有没有其他影响?例如,由于缺乏一个指针和一个新的(),它是在栈上宣布像其他本地变量做什么,然后得到在函数返回释放,或者它保存在堆中,因此坚持?

在此先感谢

+2

你有[C++书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)吗? – GManNickG 2011-01-14 17:29:43

回答

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; 

} 
1

第一个例子将堆栈分配的对象。让堆上的时候,唯一的办法就是通过new(显然,malloc或其他低级别的操作,如mmap)。

3

两个都构造对象但除此之外,是非常不同的。堆栈中的第一个构造,堆中的第二个构造。应尽可能使用第一种形式。第二种形式,如果要使用,只有当你需要的对象持久化,或者是太大,无法在堆栈中。在C++中,new不是“通常”的对象创建形式。

+0

+1此外,当我们使用`new`时,它直接进入一个智能指针,从未手动使用过。 – GManNickG 2011-01-14 17:30:16