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

Free storage for pointers stored in a heap allocated vector

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

那么,vector 可以像 shared_ptr 那样有一个自定义析构函数,可以释放存储的对象吗?

std::unique_ptr<vector<Test*>>

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

当你在栈上分配一个向量时,你只是在栈上分配这 24 个字节。当您向向量添加对象时,向量将从堆中分配内存来存储这些对象。

like I said I have to stick with this implementation since it save more stack memory than storing vector on the stack.

不会。所以你不必坚持这个实现。切换到一个明智的,例如 std::vector<std::unique_ptr<Test>>.

And I dont want objects to be copied or moved to prevent moving objects and keeping hollow ones that take more space

合理的实现(例如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

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

停止尝试优化已经优化的东西。