为什么指向同一资源的原始指针和智能指针 unique_ptr 不会导致任何问题? (C++)

问题描述 投票:0回答:1

我知道

unique_ptr
使智能指针拥有资源,因此它不允许多个指针指向同一资源。

但是为什么允许使用

.get()
创建该智能指针的原始指针,然后将其传递给函数呢? 最后你有两个拥有资源所有权的指针并且能够改变它的值?这将违反 unique_ptr 智能 ptr 独占资源的规则。

在下面的示例中,我编写了一个简单的程序来更改 smrt 指针

smrtPtr
指向的值。

例如:

#include <iostream>
#include <memory>
#include <utility> //move semantics

void changeValue(int* ptr)
{
    if (!ptr)       //check if pointer is null
        return;
    *ptr = 17;       //change value to 17
}



int main()
{

    auto smrtPtr{ std::make_unique<int>(5) };
 
    changeValue(smrtPtr.get());    //creates a raw pointer of smrtPtr

    if (smrtPtr)            //if it does contain resource
        std::cout << *smrtPtr;

        return 0;
}

非常感谢

c++ memory-management smart-pointers unique-ptr
1个回答
0
投票

您的整个问题是基于对智能指针功能的混淆:

“因此它不允许多个指针指向同一资源。”

它不做这样的事情。智能指针决定谁拥有资源,而不是谁可以查看资源。

所有者的责任只是在正确的时间删除资源。这意味着在其他事情完成读取它之前不要删除它。

唯一的指针意味着它是唯一负责删除的东西。共享指针意味着最后一个共享指针负责删除。

这些都不会影响访问资源的能力。

© www.soinside.com 2019 - 2024. All rights reserved.