如何理解智能指针的基础指针地址?

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

我正在使用Udacity的C ++ Nanodegree,并且在讲座中有一些关于智能指针的内容,我认为这是一个错误,或者我错过了一些东西。考虑以下示例:

#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,两个指针在堆栈上的地址也不同。”

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

我正在使用Udacity的C ++ Nanodegree,并且在讲座中有一些关于智能指针的内容,我认为这是一个错误,或者我错过了一些东西。请考虑以下示例:#include

c++ pointers smart-pointers
1个回答
1
投票
正确。unique_ptr

对象具有不同的堆栈地址,它们也指向不同的堆地址。

执行myClass1.reset(myClass2.get())之类的操作会使两个unique_ptr对象都指向相同的堆地址,这是对unique_ptr不变式的严重侵犯。
© www.soinside.com 2019 - 2024. All rights reserved.