C++ C++;-对于指向对象的指针向量,重新分配是否会导致删除和复制对象?
根据我到目前为止的理解,如果你有一个类对象的向量,如果你删除向量的任何成员,通常向量会重新分配它的一些对象,以保持内存的连续性。因此,您需要为擦除向量成员时要保留的所有内容实现三个规则(析构函数、复制构造函数和复制赋值运算符) 然而:对于指向类对象的指针向量,结果对我来说不太清楚。 如果我删除一个成员,那么C++就足够聪明了,只需复制指针周围的-而不是令人费解地删除指针(和它指向的类对象),然后重新创建它和它指向的对象,C++ C++;-对于指向对象的指针向量,重新分配是否会导致删除和复制对象?,c++,class,pointers,vector,rule-of-three,C++,Class,Pointers,Vector,Rule Of Three,根据我到目前为止的理解,如果你有一个类对象的向量,如果你删除向量的任何成员,通常向量会重新分配它的一些对象,以保持内存的连续性。因此,您需要为擦除向量成员时要保留的所有内容实现三个规则(析构函数、复制构造函数和复制赋值运算符) 然而:对于指向类对象的指针向量,结果对我来说不太清楚。 如果我删除一个成员,那么C++就足够聪明了,只需复制指针周围的-而不是令人费解地删除指针(和它指向的类对象),然后重新创建它和它指向的对象, 如果不是这样的话,有人能给我解释一下这种愚蠢吗?向量将删除、构造和复制它包
如果不是这样的话,有人能给我解释一下这种愚蠢吗?向量将删除、构造和复制它包含的任何类型。对于指向类/结构的指针向量,它将删除、构造和复制指针,而只保留指针指向的实际对象。这取决于您如何分配和取消分配这些资源
编辑 例如: 如果您有以下情况:
class A
{
A() {}
}
void foo(void)
{
A * pointerToA = new A;
}
在函数foo作用域的末尾,唯一被释放的是变量指针toa
本身的内存,即4个字节,其中包含一个地址(32位)-在这种情况下,该地址存储在堆栈上。为类a的新实例分配的内存将被释放的唯一方法是手动调用delete,地址为pointerToA
让我们以classA
A ** arrayOfPointerToA = new A*[10];
for(unsigned i = 0; i < 10; ++i)
arrayOfPointerToA[i] = new A;
您正在为指针数组释放内存,而不是为每个A
释放内存
在上图中,上面的delete调用释放的内存以红色突出显示。请注意,在这个实例中,每个A
都存储在内存中的随机位置,因为它们都是单独分配的
现在我们来看看向量:
一个std::vector
有效地使用新的A[size]
来分配内存。如果您正在存储一个原始指针,这意味着它将分配一个类型为a的数组,这意味着将创建size
类型为a
的对象数。当向量释放其内存时,size
类型A
的对象数量将被销毁。现在以该示例为例,用*替换A,您将看到没有破坏类型A的对象
<>这是C++和指针如何工作的基础部分,而不仅仅是容器的属性。如果容器在每个成员上任意调用delete,这就没有意义了,因为当我们有一个容器
a
时,我们将在一个对象的实例上调用delete,而不是指向该对象的无效指针。向量将不处理指针值。当您按下、弹出或擦除时,它当然会移动内部数组中的值
在这种情况下,值只是指针。但是向量中没有逻辑来确定某个对象是否是指向某个对象的指针,并在复制值时删除/重新分配它们
对于包含复杂类型而不是指针的向量,当重新分配或移动内部数组时,它当然会尝试复制值。我更希望是这样,但在web上看到了相互矛盾的语句,表明当指针被删除时,与之关联的类对象也会被删除,就像对指针调用“delete”会调用它指向的对象的析构函数一样。关于这个问题,C++上是否有任何文档?它自己被删除的指针,也就是说,保存指针值的4字节(32位机器/OSES)被释放。指针是一个独立于它所指向的内存的实体,它是在分配(新)对象时分配的。比我解释得更深入。我会用更多的信息来编辑我的帖子。谢谢康纳-你的两个答案实际上都一样好,我只是多多少少投了一枚硬币来选择一个;)@变形一点问题都没有。事实上,我们在学校就坐在一起:P
delete [] arrayOfPointerToA;