Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-对于指向对象的指针向量,重新分配是否会导致删除和复制对象?_C++_Class_Pointers_Vector_Rule Of Three - Fatal编程技术网

C++ C++;-对于指向对象的指针向量,重新分配是否会导致删除和复制对象?

C++ C++;-对于指向对象的指针向量,重新分配是否会导致删除和复制对象?,c++,class,pointers,vector,rule-of-three,C++,Class,Pointers,Vector,Rule Of Three,根据我到目前为止的理解,如果你有一个类对象的向量,如果你删除向量的任何成员,通常向量会重新分配它的一些对象,以保持内存的连续性。因此,您需要为擦除向量成员时要保留的所有内容实现三个规则(析构函数、复制构造函数和复制赋值运算符) 然而:对于指向类对象的指针向量,结果对我来说不太清楚。 如果我删除一个成员,那么C++就足够聪明了,只需复制指针周围的-而不是令人费解地删除指针(和它指向的类对象),然后重新创建它和它指向的对象, 如果不是这样的话,有人能给我解释一下这种愚蠢吗?向量将删除、构造和复制它包

根据我到目前为止的理解,如果你有一个类对象的向量,如果你删除向量的任何成员,通常向量会重新分配它的一些对象,以保持内存的连续性。因此,您需要为擦除向量成员时要保留的所有内容实现三个规则(析构函数、复制构造函数和复制赋值运算符)

然而:对于指向类对象的指针向量,结果对我来说不太清楚。 如果我删除一个成员,那么C++就足够聪明了,只需复制指针周围的-而不是令人费解地删除指针(和它指向的类对象),然后重新创建它和它指向的对象,


如果不是这样的话,有人能给我解释一下这种愚蠢吗?

向量将删除、构造和复制它包含的任何类型。对于指向类/结构的指针向量,它将删除、构造和复制指针,而只保留指针指向的实际对象。这取决于您如何分配和取消分配这些资源


编辑 例如:

如果您有以下情况:

class A
{
  A() {}
}

void foo(void)
{
   A * pointerToA = new A;
}
在函数foo作用域的末尾,唯一被释放的是变量
指针toa
本身的内存,即4个字节,其中包含一个地址(32位)-在这种情况下,该地址存储在堆栈上。为类a的新实例分配的内存将被释放的唯一方法是手动调用delete,地址为
pointerToA

让我们以class
A

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;