存储在堆分配向量中的指针的免费存储

Free storage for pointers stored in a heap allocated vector

本文关键字:存储 指针 免费 向量 分配      更新时间:2023-10-16

我有一个指向堆分配vectorunique_ptr,它本身存储指向动态分配对象的指针。问题是我认为unique_ptr释放了动态分配的向量本身,但这个向量的析构函数不会释放动态分配的对象。 那么,如何在不改变程序实现的情况下解决这个问题呢?我知道如果我使用shared_ptr我可以使用自定义析构函数来释放存储空间,但出于特定原因,我必须坚持使用unique_ptr

那么,向量是否可以像shared_ptr一样具有自定义析构函数,可以释放存储的对象?

std::unique_ptr<vector<Test*>>

您对类型在C++中的工作方式有误解。每种类型都有固定的大小。你可以得到这个大小sizeof.例如,在典型平台上,vector<Test*>的大小为 24 字节。

在堆栈上分配向量时,仅在堆栈上分配这 24 个字节。将对象添加到向量时,向量将从堆中分配内存来存储这些对象。

就像我说的,我必须坚持这个实现,因为它比在堆栈上存储矢量节省更多的堆栈内存。

不会的。因此,您不必坚持此实现。切换到明智的,例如std::vector<std::unique_ptr<Test>>.

而且我不希望复制或移动对象以防止移动对象并保留占用更多空间的空心对象

合理的实现(如std::vector<std::unique_ptr<Test>>(不会移动底层对象。std::vector的移动语义在任何合理的平台上都已经是最佳的。

您希望移动std::unique_ptr与移动std::vector明显不同。你对这个假设的推理是错误的,即使它是正确的,这仍然是毫无意义的复杂性增加。

事实上,为什么不直接使用vector<Test>

看看这个:

#include <iostream>
#include <vector>
int main()
{
std::vector<int> a;
for (int i = 0; i < 10; ++i)
a.push_back(i);
std::cout << &a[0] << std::endl;
std::vector<int> b = std::move(a);
std::cout << &b[0] << std::endl;
}

输出:

0x563caf0f1f20
0x563caf0f1f20

请注意,移动矢量甚至不会移动矢量中的对象。它只是将对象的所有权从一个向量转移到另一个向量。

停止尝试优化已经优化的内容。