C ++类数组内存重新分配

时间:2017-02-13 13:43:45

标签: c++ memory-management heap-memory

如果这个问题已被提出,我很抱歉,但我不知道如何说出这个问题。 所以我正在构建一个应用程序,它需要真正的内存效率,因为它在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]内存的值是否被释放。

2 个答案:

答案 0 :(得分:5)

  

据我所知,对象基本上是指向类的字段的指针,在调用构造函数时,你会得到一个指向对象的新指针[。]

不,在C ++中,一个对象是......好吧,一个实际的对象。 MyClass objects[10]由10个MyClass es并排组成,不涉及指针。

当您编写objects[0] = MyClass(/* ... */);时,您正在构建一个新的MyClass,然后将其分配(复制)到数组中的第一个MyClass,然后将其销毁。再次,没有涉及指针。

答案 1 :(得分:1)

  

现在我的问题是,当我将对象[0]更改为另一个值时,是否会释放第一个对象[0]内存?

没有。在整个数组的生命周期中,10个对象是相同的。没有添加或删除任何对象。所有对象的内存(不计算它们可能拥有的动态内存)在数组的生命周期开始时分配,并在数组的生命周期结束时释放。

当您分配给数组的一个成员时,复制(或移动)赋值运算符会更改数组中对象的状态。从中复制的临时对象在赋值结束时被销毁。

  

据我所知,对象基本上是指向类

字段的指针

这对我来说似乎有误导性。更好的类比是对象是一块内存,成员对象是该内存块中的子对象。就像数组是一块内存一样,数组的成员也是该内存块中的子对象。

你的指针类比在某些语言中是合适的,例如Java,其中非原始变量是隐式指针。但不是像C ++这样的语言,其中指针是显式的,而隐式使用值语义。