据我目前的理解,如果你有一个类对象的 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
分配内存.
在上图中,上面调用 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/