2017-02-13 90 views
0

對不起,如果這個問題已經被問到,但我不知道如何說出這個權利。 因此,我構建了一個應用程序,因爲它在Arduino Uno(2kbyte sram)上並且無法加載所需的全部類對象,所以我決定將它部分加載。 這基本上是我計劃如何做到這一點:C++類數組內存重新分配

//declare class object array 
MyClass objects[10]; 
objects[0] = MyClass(*parameters for initializing*); 
.... 
.... 
//Some code with objects 
//now changing the objects 
objects[0] = MyClass(*parameters for initializing*); 

現在的問題是將第一對象[0]內存中,當我改變的對象[0]到其他值中解脫出來? 據我瞭解,一個對象基本上是一個指向類的字段的指針,當調用一個構造函數時,你會得到一個指向對象的新指針,所以我在代碼中做的是改變對象[0]指向的對象但是我不確定第一個指向對象的值是否被釋放。

+2

「據我所知,一個對象基本上是一個指向類的字段的指針」 - 你明白錯誤。一個對象在許多方面與C結構相同。 –

回答

5

據我瞭解的對象基本上是一個指針類的字段和調用構造函數,當你得到一個新的指針指向的對象[。]

沒有,在C++中對象是......好吧,一個實際的對象。 MyClass objects[10]由十個MyClass並排組成,不涉及指針。

當您編寫objects[0] = MyClass(/* ... */);時,您正在構造一個新的MyClass,然後將它分配(複製)到數組中的第一個MyClass,然後銷燬它。再次,沒有指針參與。

+0

因此,如果我理解正確,它將始終使用相同的內存字節? –

+0

@ S.Korai的確如此。 – Quentin

+0

謝謝你,現在我知道如何繼續我的項目 –

1

現在我的問題是,當我將object [0]更改爲另一個值時,第一個對象[0]內存是否會被釋放?

不。在整個數組的壽命期間,這10個對象是相同的。不會添加或刪除任何對象。所有對象(不包括它們可能擁有的動態內存)的內存在數組的生命週期開始時分配,並在數組的生命週期結束時釋放。

當您分配給數組的一個成員時,副本(或移動)賦值操作符將更改數組內的對象的狀態。被複制的臨時對象在作業結束時被銷燬。

據我瞭解的對象基本上是一個指針類

這似乎是誤導我的領域。更好的比喻是對象是內存塊,成員對象是該內存塊中的子對象。就像數組是內存塊一樣,數組的成員是該內存塊中的子對象。

您的指針比喻適用於像Java這樣的非基本變量是隱式指針的某些語言。但不是像C++這樣的語言,其中指針是顯式的,並且隱含地使用了值語義。

+0

謝謝你的回答,我猜你已經掌握了頭腦,因爲我的大部分OOP知識來自學習c#。 –