如果这个问题已被提出,我很抱歉,但我不知道如何说出这个问题。 所以我正在构建一个应用程序,它需要真正的内存效率,因为它在Arduino Uno(2kbyte sram)上并且无法加载我需要的完整数组的对象,所以我决定将它加载到部分中。 这基本上就是我计划的方式:
//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]指向的对象但我不确定第一个指向对象[0]内存的值是否被释放。
答案 0 :(得分:5)
据我所知,对象基本上是指向类的字段的指针,在调用构造函数时,你会得到一个指向对象的新指针[。]
不,在C ++中,一个对象是......好吧,一个实际的对象。 MyClass objects[10]
由10个MyClass
es并排组成,不涉及指针。
当您编写objects[0] = MyClass(/* ... */);
时,您正在构建一个新的MyClass
,然后将其分配(复制)到数组中的第一个MyClass
,然后将其销毁。再次,没有涉及指针。
答案 1 :(得分:1)
现在我的问题是,当我将对象[0]更改为另一个值时,是否会释放第一个对象[0]内存?
没有。在整个数组的生命周期中,10个对象是相同的。没有添加或删除任何对象。所有对象的内存(不计算它们可能拥有的动态内存)在数组的生命周期开始时分配,并在数组的生命周期结束时释放。
当您分配给数组的一个成员时,复制(或移动)赋值运算符会更改数组中对象的状态。从中复制的临时对象在赋值结束时被销毁。
据我所知,对象基本上是指向类
字段的指针
这对我来说似乎有误导性。更好的类比是对象是一块内存,成员对象是该内存块中的子对象。就像数组是一块内存一样,数组的成员也是该内存块中的子对象。
你的指针类比在某些语言中是合适的,例如Java,其中非原始变量是隐式指针。但不是像C ++这样的语言,其中指针是显式的,而隐式使用值语义。