Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 它强制堆分配吗?_C++ - Fatal编程技术网

C++ 它强制堆分配吗?

C++ 它强制堆分配吗?,c++,C++,通常,99.9%的时间(AFAIK)会进行以下对象初始化: MyClass myObject(5); 或同等地 MyClass myObject = MyClass(5); 将导致在堆栈上创建myObject 但是,如果在下一行中myObject被传递给函数,如下所示: myFunction(&myObject) myFunction(&myObject) 它不会导致错误,相反,对象会被神奇地分配到堆上。是真的还是我遗漏了什么?不,不是真的。这里没有什么神奇的事情发生:

通常,99.9%的时间(AFAIK)会进行以下对象初始化:

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)。函数调用返回后,对对象所做的任何更改都将反映在调用函数中;指针并不总是指向堆,它们也可以指向堆栈。