如何理解智能指针的底层指针地址?
How to understand the underlying pointer address of a smart pointer?
我正在学习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 的 get 方法来获取指向在堆上分配的托管数据的指针。因此,此地址应该是堆地址,而不是内部指针所在的堆栈地址。(智能指针的内部原始指针的堆栈地址不应该从外部访问吗?
这段代码的官方解释是:"显然,两个指针在堆栈上都有不同的地址,即使在将内容从 myClass2 复制到 myClass1 之后也是如此。
但是它不应该这样说:"两个指针仍然指向它们各自的堆地址,只是数据已从一个地址复制到另一个地址"?
正确。unique_ptr
对象具有不同的堆栈地址,并且它们也指向不同的堆地址。
执行类似myClass1.reset(myClass2.get())
的操作会使两个unique_ptr
对象都指向同一个堆地址,这是对unique_ptr
不变量的严重违反。
相关文章:
- CUDA:统一内存和指针地址的更改
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 向指针地址添加 20 个字节偏移量
- 如何理解智能指针的底层指针地址?
- 初学者问题:C++指针/地址 - 和变量之后不是以前?
- 返回数组中值的指针地址
- C++向指针地址添加 4 个字节
- 指针地址的内存偶尔更改了函数前和后返回
- 如何根据指针地址获取指针内容
- C++ 将指针地址传递给函数
- 直接从指针/地址访问数组的元素
- 如何在没有作弊引擎的情况下从其他应用程序获取指针地址?
- 如何保存指针地址,以便另一个指针可以继续处理它
- 间接寻址运算符如何返回带有运算符重载的指针地址
- 使用已删除的指针地址.据我所知,
- 如何保护类外用户可以修改的指针地址?C++
- 多个调用构造函数将更改C 中的成员指针地址
- 类对象指针的向量:如何在指针地址获得价值?C 和SDL_RECT
- Visual Studio C 2K15-在指针地址上获取错误
- 指针地址和参考混乱