存储在堆分配向量中的指针的免费存储空间
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
请注意,移动矢量甚至不会移动矢量中的对象。它只是将对象的所有权从一个向量转移到另一个向量。
停止尝试优化已经优化的东西。
我有一个 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
请注意,移动矢量甚至不会移动矢量中的对象。它只是将对象的所有权从一个向量转移到另一个向量。
停止尝试优化已经优化的东西。