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

标签 c++ class pointers vector rule-of-three

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

但是:对于指向类对象的指针 vector ,结果对我来说不太清楚。 如果我删除一个成员,那么 C++ 肯定足够聪明,可以只复制指针——而不是疯狂地删除指针(和它指向的类对象)然后重新创建它和它再次指向的对象?

如果不是这种情况,有人可以向我解释一下这个白痴吗?

最佳答案

vector 将删除、构造和复制它包含的任何类型。在指向类/结构的指针 vector 的情况下,它将删除、构造和复制指针,单独留下指针指向的实际对象。分配和取消分配这些由您决定。


编辑

一个例子:

如果您有以下情况:

class A
{
  A() {}
}

void foo(void)
{
   A * pointerToA = new A;
}

在函数 foo 作用域的末尾,唯一被释放的是变量 pointerToA 的内存。本身,即保存地址的 4 个字节(32 位)——在本例中,地址存储在堆栈中。为类 A 的新实例分配的内存将被释放的唯一方法是,如果您手动调用 delete,地址为 pointerToA。 .

让我们以类A 的数组为例

A ** arrayOfPointerToA = new A*[10];
for(unsigned i = 0; i < 10; ++i)
  arrayOfPointerToA[i] = new A;

这类似于当您有 std::vector<A*> 时发生的情况.当你打电话时

delete [] arrayOfPointerToA;

您正在为指针数组 释放内存,而不是为每个A 分配内存.

enter image description here

在上图中,上面调用 delete 释放的内存以红色突出显示。请注意,每个 A在此实例中,它们存储在内存中的随机位置,因为它们都是单独分配的。

现在将其转化为 vector :

A std::vector<A> 有效地使用新的A[size]分配内存。如果你正在存储一个原始指针,这意味着它将分配一个 A 类型的数组,这意味着 size A 类型的对象数量被创建。当 vector 释放内存时 size A 类型的对象数量被摧毁。现在以该示例为例,将 A 替换为 A*,您将看到没有类型 A 的对象被销毁。

这是 C++ 和指针工作方式的基本部分,而不仅仅是容器的属性。如果容器确实对每个成员任意调用 delete,那么当我们有一个容器时这就没有意义了 A我们会在对象的实例上调用 delete,而不是指向无效对象的指针。

关于C++ - 对于指向对象的指针 vector ,重新分配是否会导致删除和复制对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22702726/

相关文章:

c++ - 为什么 Z3 BitVec 对象没有运行时大小信息?

C++ 使用 Flash 或类似的动画

c++ - 基于指针类型的参数重载函数的最佳方法 |引用?

java - 如何在动态加载的 jar 中模拟方法

class - 为什么我可以将null分配给Unit值,为什么将其转换为()?

c++ - 如何将对象指针存储在数组中

Python - 程序收到信号 SIGSEGV,段错误

c++ - 初始化静态类成员

c - 从链表中删除节点

c - 使用 malloc 初始化结构内部的结构?