例如这个类:
class RTPIPv4Address{
public:
RTPIPv4Address(int a, int b);
}
愚蠢的问题,但是...我只是偶然发现了一个代码,它初始化了一个像这样的类实例,例如
RTPIPv4Address adr(2,2);
现在我想知道,这只是通常的
的另一种语法RTPIPv4Address* adr = new RTPIPv4Address (2,2);
还是有其他影响?例如,由于缺少指针和new(),它是否像其他局部变量一样在堆栈上声明,然后在函数返回时被释放,或者它是否保存在堆上并因此保持不变?
提前致谢
答案 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
)。