一般来说,99.9%的时间(AFAIK),以下对象初始化:
MyClass myObject(5);
或等效
MyClass myObject = MyClass(5);
将导致在堆栈上创建myObject。
但是,如果将以下行myObject
传递给函数,如下所示:
myFunction(&myObject)
它不会导致错误,而是在堆上神奇地分配对象。是真的还是我错过了什么?
答案 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
除外)