c++ - 如何理解智能指针的底层指针地址?

标签 c++ pointers smart-pointers

我正在攻读 Udacity 的 C++ 纳米学位,讲座中有一些关于智能指针的内容,我认为这是一个错误,或者我遗漏了什么。 考虑以下示例:

#include <iostream>
#include <memory>
#include <string>

class MyClass
{
private:
    std::string _text;

public:
    MyClass() {}
    MyClass(std::string text) { _text = text; }
    ~MyClass() { std::cout << _text << " destroyed" << std::endl; }
    void setText(std::string text) { _text = text; }
};

int main()
{
    // create unique pointer to proprietary class
    std::unique_ptr<MyClass> myClass1(new MyClass());
    std::unique_ptr<MyClass> myClass2(new MyClass("String 2"));

    // call member function using ->
    myClass1->setText("String 1");

    // use the dereference operator * 
    *myClass1 = *myClass2;

    ---This is the part I don't understand---
    // use the .get() function to retrieve a raw pointer to the object
    std::cout << "Objects have stack addresses " << myClass1.get() << " and " << myClass2.get() << std::endl;

    return 0;
}

我是这样理解这个例子的: 他们使用 unique_ptr's get method获取指向托管数据的指针,该数据分配在堆上。所以这个地址应该是堆地址,不是内部指针所在的堆栈地址。 (智能指针的内部原始指针的堆栈地址应该不能从外部访问吧?)

官方对这段代码的解释是:“很明显,两个指针在堆栈上的地址不同,即使在将内容从 myClass2 复制到 myClass1 之后也是如此。”

但它不应该这样说:“两个指针仍然指向它们各自的堆地址,只是数据已从一个地址复制到另一个地址”?

最佳答案

正确。 unique_ptr objects 有不同的堆栈地址,它们也指向不同的堆地址。

myClass1.reset(myClass2.get()) 这样的操作会让两个 unique_ptr 对象指向相同的堆地址,这是对 的严重违反unique_ptr 不变。

关于c++ - 如何理解智能指针的底层指针地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59323259/

相关文章:

c - 段错误问题

visual-c++ - 如何将 GetProfileBinary 的结果保存到智能指针中?

c++ - ADSI 使用 C++ 过滤 OU 中的所有计算机

c++ - 在 Crypto++ 库中找不到 hkdf.h

C++ 链表/节点模板指针在方法返回后不会保持 NULL

c++ - 如何使用常量引用访问 vector<int*> 的元素?

c++ - 为什么在没有明确的 return 语句的情况下,递归的 return 调用会脱离堆栈?

c++ - 整数常量上的错误后缀 Ui64 无效

c++ - 我们什么时候应该在 unique_ptr 中使用自定义删除器而不是默认删除器?

c++ - 将 unique_ptr<Derived>& 传递给接受 unique_ptr<Base>& 的函数