C++ 它强制堆分配吗?
通常,99.9%的时间(AFAIK)会进行以下对象初始化:C++ 它强制堆分配吗?,c++,C++,通常,99.9%的时间(AFAIK)会进行以下对象初始化: MyClass myObject(5); 或同等地 MyClass myObject = MyClass(5); 将导致在堆栈上创建myObject 但是,如果在下一行中myObject被传递给函数,如下所示: myFunction(&myObject) myFunction(&myObject) 它不会导致错误,相反,对象会被神奇地分配到堆上。是真的还是我遗漏了什么?不,不是真的。这里没有什么神奇的事情发生:
MyClass myObject(5);
或同等地
MyClass myObject = MyClass(5);
将导致在堆栈上创建myObject
但是,如果在下一行中myObject
被传递给函数,如下所示:
myFunction(&myObject)
myFunction(&myObject)
它不会导致错误,相反,对象会被神奇地分配到堆上。是真的还是我遗漏了什么?不,不是真的。这里没有什么神奇的事情发生:
myFunction(&myObject)
这就是在堆栈上获取myObject
的地址(如果它确实在那里),并将该地址传递给myFunction
,您说过:
但是,如果在下一行中,myObject被传递给函数,如下所示:
myFunction(&myObject)
myFunction(&myObject)
它不会导致错误,相反,对象会被神奇地分配到堆上。这是真的还是我遗漏了什么
这是不对的。电话
myFunction(&myObject)
只需使用堆栈上的对象
myObject
的地址调用myFunction
函数调用是否会导致错误取决于函数的定义。它与位于堆或堆栈中的对象无关。
在这里,将myObject的地址传递到函数中,函数需要通过指针传递参数,如下所示:
myFunction(MyClass* myObject);
考虑以下几点:
int * foo ()
{
int x = 0;
return x;
}
因为x
是在堆栈上分配的,当foo
完成时,它就超出了范围,没有神奇的事情发生,只是未定义的行为通常会导致核心转储
堆分配需要调用<代码>新< /C>(除了放置<代码>新< /C> >
“这是真的还是我丢失了什么?”一个基本的C++入门书大概。你所展示的内容与堆(动态存储)分配无关。C++中没有任何“神奇地”分配给堆,除非你用新的方式来这样做。这是不正确的。需要使用new把东西放到堆上。一些模板和类为ypu执行此操作“&myObject”将对象的地址传递给被调用的函数(此处为myFunction)。函数调用返回后,对对象所做的任何更改都将反映在调用函数中;指针并不总是指向堆,它们也可以指向堆栈。