Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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++;堆栈和堆上的结构和数组、值、引用和解引用问题_C++_C++11 - Fatal编程技术网

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)解释。可消除的临时值,以及由新构造的值。