C++将shared_ptr用于连续分配的内存
C++ use shared_ptr for continuous allocated memory
我想创建一些连续内存,并使用一堆指向它们的shared_ptr。
int main() {
int *arr = new int[5];
for (int i = 0; i < 5; i++) {
std::shared_ptr<int> ptr(&arr[i]);
}// when the loop scope end, the shared_ptr will be destroyed.
};
该代码将给出一个错误:
pointer being freed was not allocated
我的期望是:当循环的范围结束时,sharedptr将被销毁,数组中的元素将依次被销毁。
但似乎当第一个指针被破坏时,整个数组就被释放了。
我也试过std::allocator
,但仍然不起作用。
那么,有没有任何方法可以分配连续内存,我可以使用shared_ptr指向它们中的每一个,然后当第一个元素被释放时,整个内存不会一起被释放?
这是一件"有趣"的事情,但如果你真的想这样做,你可以使用shared_ptr
的别名构造函数。
int main() {
std::shared_ptr<int[]> arr(new int[5]);
for (int i = 0; i < 5; i++) {
std::shared_ptr<int> ptr(arr,&arr[i]);
}
};
如果没有c++17,你需要做更多的工作:
int main() {
std::shared_ptr<int[]> arr(new int[5], std::default_delete<int[]> {});
for (int i = 0; i < 5; i++) {
std::shared_ptr<int> ptr(arr, &arr.get()[i]);
}
};
当最后一个元素shared_ptr
被破坏时,该数组将被删除(假设数组shared_ptr
本身已经被破坏/重置(。
您滥用shared_ptr
。您分配的内存是用operator new[]
分配的,因此应该用operator delete[]
释放它。
此外,由于分配的对象是一个数组,任何所有权语义都应该应用于整个数组,而不是在其元素之间划分!
您可以通过为shared_ptr
:(C++11/14(指定自定义删除程序来实现
std::shared_ptr<int> arr_ptr(new int[5], std::default_delete<int[]> {});
或者简单地使用shared_ptr
(C++17(的数组类型专用化:
std::shared_ptr<int[]> arr_ptr(new int[5]); // Will call delete[] upon destruction.
相关文章:
- 当需要超过16GB的连续内存时,内存分配失败
- vector是否为std::移动的对象连续分配内存
- C++将shared_ptr用于连续分配的内存
- 分配/访问2d阵列,使得2d子块是连续的
- 在内存中连续分配的多维数组的实现
- 为什么动态分配的两个变量的内存位置不是连续的?
- 如何防止连续使用"new"时分配失败时内存泄漏
- 连续内存分配
- 如何在C++中动态分配连续的二维数组?
- 为什么我不能在同一分配中保留两个连续的内存区域,而不通过单个调用保留这两个区域?
- std::vector 的连续内存分配
- 连续分配多维阵列
- 如何将连续的内存块(动态地)添加到先前分配的动态内存中
- 分配大块连续内存 - 做还是不做?
- C++ 向量不分配连续内存
- 是在连续空间中分配的嵌套向量
- 如何使分配运算符重载适用于连续分配
- 动态分配 3D 数组的内存,该数组使用最小内存,并且在 C++ 中以连续形式
- 在实现中,继承是来自连续分配的多个层的数据成员
- 顺序'new'运算符是否创建连续分配的内存?