它是否强制堆分配?

时间:2015-06-08 17:06:55

标签: c++

一般来说,99.9%的时间(AFAIK),以下对象初始化:

MyClass myObject(5);

或等效

MyClass myObject = MyClass(5);

将导致在堆栈上创建myObject。

但是,如果将以下行myObject传递给函数,如下所示:

myFunction(&myObject)

它不会导致错误,而是在堆上神奇地分配对象。是真的还是我错过了什么?

4 个答案:

答案 0 :(得分:6)

不,这不是真的。这里没有什么神奇的事情发生:

myFunction(&myObject)

这只是在堆栈上取myObject的地址(如果它确实在那里),并将该地址传递给myFunction

答案 1 :(得分:1)

你说:

  

但是,如果在以下行中将myObject传递给函数,如下所示:

myFunction(&myObject)
     

它不会导致错误,而是在堆上神奇地分配对象。是真的还是我错过了什么?

这是不正确的。电话

myFunction(&myObject)

只会使用myObject的地址(即堆栈中的对象)来调用myFunction

答案 2 :(得分:0)

您的函数调用是否会导致错误取决于函数的定义。它与位于堆或堆栈的对象无关。 在这里,你将myObject的地址传递给你的函数,你的函数需要通过指针传递参数,如下所示:

myFunction(MyClass* myObject);

答案 3 :(得分:0)

请考虑以下事项:

int * foo ()
{
    int x = 0;
    return x;
}

因为x已在堆栈上分配,当foo完成时,它会超出范围,并且不会发生任何魔法,只是未定义的行为通常会导致核心转储

堆分配需要调用new(展示位置new除外)