C++ C++;堆栈和堆上的结构和数组、值、引用和解引用问题
我对这个有点生疏了。我试图弄清楚对象声明、值和引用、堆栈和堆到底会发生什么。我知道基本情况,但不确定以下示例:C++ C++;堆栈和堆上的结构和数组、值、引用和解引用问题,c++,c++11,C++,C++11,我对这个有点生疏了。我试图弄清楚对象声明、值和引用、堆栈和堆到底会发生什么。我知道基本情况,但不确定以下示例: struct MyObject { int foo; MyObject(int val) { foo = val; } MyObject()//[EDIT] default constructor { } } //... //1) //this reserves memory on the stack f
struct MyObject
{
int foo;
MyObject(int val)
{
foo = val;
}
MyObject()//[EDIT] default constructor
{
}
}
//...
//1)
//this reserves memory on the stack for MyObject0 and initializes foo:
MyObject a = MyObject(1); //[EDIT] fixed from comments
//2)
MyObject* b = new MyObject(2);//This I know reserves memory on the heap,
//returns a pointer to it (and calls constructor).
//There are also other ways like malloc or memset.
//3)
MyObject c = *(new MyObject(3));// So here we instantiate MyObject on the heap,
//return a pointer to it but the pointer is dereferenced outside the parenthesis.
//Is c now a newly created value type copy on the stack?
//And is the original new MyObject(3) now inaccessible in the heap memory (leaked)
//because the pointer to it was never stored?
//4)
// void myFunc( MyObject c){}
myFunc(c); //Am I doing a member-wise assignment from c to a new function-scope
//temporary MyObject reserved somewhere else in memory (in a stack frame?)?
//Or am I somehow passing a reference to c even though c is not a pointer or reference?
//[EDIT] myFunc(c); would pass as a reference if I had void myFunc( MyObject &c){}
最后,如果我有一个
MyObject[]myobjectarr1=newmyobject[10]()
我在堆上有10个未初始化的MyObject结构,在堆上还有一个MyObject
数组类型的指针
如何在堆栈上声明MyObject数组,其中数组中的MyObject结构也在堆栈上?或者这不是你要做的事吗?让我以更准确的方式重新评论一下: 1) 这将在堆栈上创建一个
a
变量,并使用临时MyObject(1)
的值初始化它,该值在堆栈上创建为MyObject
调用MyObject::MyObject(1)
作为构造函数。编译器可以消除中间步骤。你可以像MyObject a(1)那样简单地完成它代码>注意:=
不是作业
2) 通过调用MyObject::MyObject(2)
在堆上创建MyObject
,并返回指向它的指针,用于初始化b
指针
忘记malloc
和memset
:它们分配内存,但不分配
构造对象。你越早忘记它们,对你就越好
还有其他人
3) 在堆上创建一个Myobject
,并通过调用myobect::Myobject(3)
构造,然后取消引用新的返回指针,并使用结果值通过复制初始化c
。堆上创建的对象在其中被“遗忘”。(内存泄漏:您没有机会进一步访问它)
4) 对象c
被复制到myFunc
的本地参数c
(实际上,两个c
是两个不同的对象)中,这两个对象将存在到堆栈中,直到函数退出。(1)MyObject a代码>无法编译,因为MyObject
缺少默认构造函数。“它在这里也调用默认构造函数吗?”如果存在的话,它会这么说。你对(2)和(3)的结论是正确的。(4) myFunc
的参数是从c
复制初始化的。由于MyObject
缺少用户定义的复制构造函数,编译器生成的复制构造函数确实会执行成员复制初始化。@Tudor,行MyObject a;编译?不应该,因为您定义了自己的构造函数,默认构造函数不应该对您可用。您是正确的。因此,只有在我没有定义构造函数的情况下,这才会编译,MyObject[]myobjectarr1=new MyObject[10]
也不会编译。如果有,您只需编写MyObject-myobjar[10]代码>MyObject a的道具(1)代码>解释。可消除的临时值,以及由新构造的值。