C++将shared_ptr用于连续分配的内存

C++ use shared_ptr for continuous allocated memory

本文关键字:连续 分配 内存 用于 ptr shared C++      更新时间:2023-10-16

我想创建一些连续内存,并使用一堆指向它们的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.