存储在堆分配向量中的指针的免费存储
Free storage for pointers stored in a heap allocated vector
我有一个指向堆分配vector
的unique_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
请注意,移动矢量甚至不会移动矢量中的对象。它只是将对象的所有权从一个向量转移到另一个向量。
停止尝试优化已经优化的内容。
- 存储指针值需要多少位
- 如何存储指针以功能模板,该模板将可呼叫对象作为其参数之一
- 为什么unique_ptr向量是存储指针的首选方法
- 我应该如何在Qt中存储指针
- 强制提升变体以存储指针
- 更好的是:存储对象与存储指针
- 在课堂上存储指针
- c++在存储指针元组时遇到问题
- 尝试学习boost::interactive Q3-在IC中存储指针时,我应该使用smart_pointer吗
- boost::numeric::ublas::矢量内部数据存储指针
- QList如何决定是存储指针还是存储项目本身
- 这些存储指针数组的方法之间有区别吗
- Boost属性树:如何在其中存储指针
- 在std::容器中选择存储值还是存储指针时的注意事项
- 在 std::vector 中存储指针会破坏连续内存存储的优势
- 设置不存储指针集合
- 在类中存储指针或对象
- 如何存储指针的矢量,包含不同的类型
- C++:字段对象可以在不存储指针的情况下知道其"parent"吗?
- 如何为在 std::map 中存储指针的模板类编写复制构造函数