指向相同内存区域的unique_ptr
unique_ptr pointing always to the same memory area
考虑以下代码:
using namespace std;
int* get()
{
unique_ptr<int> p (new int[4]);
return p.get();
}
int main(int argc, char **argv)
{
int *arr1=get();
int* arr2=get();
for(int i=0;i<4;i++)
{
arr1[i]=i;
arr2[i]=i*2;
}
for(int i=0;i<4;i++)
cout << arr1[i];
return 0;
}
arr1和arr2指向相同的内存区域。所以他们有着相同的价值观。我不明白为什么,当我调用arr2=get()时:
unique_ptr<int> p (new int[4]);
不应该再次创建此对象?它没有被删除,因为arr1仍然可以访问。如何获得两个不同内存区域的数组?
我敢肯定你在玩未定义的行为,这很糟糕。
当唯一指针被破坏时,所指向的数据被破坏了,事实上值是相同的,并且选择了相同的插槽是幸运的。
对于指向数组类型的指针,请使用矢量
std::vector<int> get()
{
return std::vector<int>(4);
}
int main()
{
std::vector<int> arr1=get();
std::vector<int> arr2=get();
return 0;
}
对于普通的单值指针,则可以返回unique_ptr;
std::unique_ptr<int> get(){
return std::unique_ptr<int>(new int(0));
}
:::
std::unique_ptr<int> ptr=get();
在这种智能指针的使用中存在内存泄漏。unique_ptr将使用运算符delete来释放分配的内存,但您需要delete[]。此外,get函数的返回值将是一个无效的ptr,因为unique_ptr将释放分配的区域。如果您需要动态分配的数组,那么请使用std::vector。
相关文章:
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误