Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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++_Memory - Fatal编程技术网

关于C++指针和物理内存

关于C++指针和物理内存,c++,memory,C++,Memory,我有一个澄清 class Foo { } main() { Foo obj; //1 method(obj); method1(&obj); Foo* obj1; method2(&obj1); //4 } void method(Foo objfoo) //2 { } void method1(Foo* objfoo) //3 { } void method2(Foo* & objfoo){} 问题1。它会在主堆

我有一个澄清

class Foo
{

}

main()   
{
   Foo obj; //1
   method(obj);
   method1(&obj);

   Foo* obj1;
   method2(&obj1);  //4

}

void method(Foo objfoo) //2
{

}

void method1(Foo* objfoo) //3
{

}

void method2(Foo* & objfoo){}
问题1。它会在主堆栈框架内分配对象吗

问题2。它会在方法堆栈框架内再创建一个Foo副本吗

第三季度。是否会指出主方法中obj中存在相同的对象

第四季度。这意味着什么?需要解释吗?

Q1:是

Q4:&表示的地址。获取一个指针的地址将为您提供一个指向一个Foo**指针的指针

问题2:是的

问题3:是的

方法2:无效,应该是

void method2(Foo** obj);

它们是按Q1、Q2等顺序排列的,而不是问题中出现的顺序

对至少在一定程度上存在堆栈帧或堆栈。 是的,至少在理论上,实际上,编译器可能省略了副本。 是,method1接收指向预先存在的对象的指针。 它正在将obj1的地址传递给method2。
旁白:第4季度提到的method2调用实际上不起作用。由于obj1被定义为指向Foo的指针,而method2引用指向Foo的指针,因此不需要显式获取点的地址来进行调用。这样做会创建指向指针的指针,其中method2需要指向指针的引用。使用method2obj1;至少在语法上是正确的,但它是否真的能正确工作还有待商榷。

@Ademiban,需要理由来结束这个问题。由于我是C++初学者,需要对上面的问题进行一些确认,以便更好地理解C++对象的内存模型。期待特定格式的问题是不正确的。在编写代码时,使用{}图标使您的代码可以很好地打印出来,您需要先选择它。我有一个基本问题。。。谁负责创建堆栈框架并将函数二进制文件从文本区域加载到堆栈框架?什么时候会发生?操作系统和编译器正在为您执行此操作。在进程启动之前,将加载所有代码。调用函数时堆栈会发生更改,即在调用它的行和函数的第一行之间。你永远不用担心。我有一个基本问题。。。谁负责创建堆栈框架并将函数二进制文件从文本区域加载到堆栈框架?什么时候会发生?@Muthu:构建/销毁堆栈帧的代码通常会编译成代码,例如,一个函数将以push-bp/mov-bp、sp/sub-sp、frame_-size等开头,以pop-bp/ret等结尾。同样,对于初始化局部变量,例如,ctor调用将编译成二进制。