これはちょっと錆びています。私はオブジェクトの宣言、値と参照、スタックとヒープで何が起こるかを正確に把握しようとしています。私は基本を知っているが、以下の例については不明な点が午前:私はMyObject[] myObjArr1 = new MyObject[10]()
を持っている場合スタック上のC++の構造体と配列、ヒープ、値、参照、参照解除の質問
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){}
最後に、私は10の、初期化されていないMyObjectにヒープ上の構造体、およびヒープ上のタイプMyObject
配列のポインタとしてもを持っています。
配列内のMyObject構造体もスタック上にあるMyObject配列をスタック上に宣言するにはどうすればよいですか?それともあなたがしていることではありませんか?
**(1)** 'MyObject'にはデフォルトのコンストラクタがないので、' MyObject a; 'はコンパイルされません。 * "ここでもデフォルトのコンストラクタが呼び出されていますか?" **(2)**と**(3)**のあなたの結論は正しいです。 **(4)** 'myFunc'のパラメータは' c'からコピー初期化されます。 'MyObject'にはユーザ定義のコピーコンストラクタがないので、コンパイラが生成したものは実際にメンバごとのコピー初期化を実行します。 –
@ Tudor、行MyObjectを行います。コンパイル?あなた自身のコンストラクターを定義して以来、デフォルトのコンストラクターを使用できないようにすべきではありません。 – feldi
あなたは正しいです。これは、コンストラクタが定義されていない場合にのみコンパイルされます。 – Spectraljump