使用智能指针指向常量int的指针



我正试图创建一个智能指针(unique_ptr(,指向作为const int&返回的值,但我的问题可以简单地总结为:

const int value = 5;
const int * ptr{nullptr};
ptr = &value;

这是有效的,并按预期编译。当尝试使用智能指针进行相同操作时:

const int value = 5;
std::unique_ptr<const int> ptr{nullptr};
ptr = &value;

有了这个,我得到了编译错误:

no operator "=" matches these operands -- operand types are: std::unique_ptr<const int, std::default_delete<const int>> = const int *

有可能得到与普通C指针相同的行为吗?

编辑:我发现我最初的问题过于简化了:这是一个更高级的版本:

int value = 5;
const int& getValue(){
return value;
};
std::unique_ptr<const int> ptr1{nullptr};
const int * ptr2{nullptr};
ptr1 = std::make_unique<const int>(getValue());
ptr2 = &getValue();
std::cout << "ptr1: " << *ptr1 << "n";
std::cout << "ptr2: " << *ptr2 << "n";
value++;
std::cout << "ptr1: " << *ptr1 << "n";
std::cout << "ptr2: " << *ptr2 << "n";

打印出来:

ptr1: 5
ptr2: 5
ptr1: 5
ptr2: 6

正如你所看到的,行为有点不同,现在我相信这是因为make_unique复制了指向内存地址中的值

std::unique_ptr不能由原始指针直接赋值;您可以使用reset。但你不应该分配value的地址(当它自动离开作用域时会被破坏(,std::unique_ptr会尝试将指针delete指向UB。

你可能想要

int value = 5; // we'll constructor a new object, value doens't need to be const
std::unique_ptr<const int> ptr{nullptr};
ptr = std::make_unique<const int>(value); // construct a new object and pass the ownership to ptr

编辑

为了使用智能指针,

智能指针用于确保对象在不再使用(引用(时被删除。

如果您不希望智能指针管理对象,或者不能让智能指针拥有对象,则不应该使用智能指针。对于这种特殊情况,我认为使用原始指针是很好的。

std::unique_ptr是原始指针和内存分配机制的包装器。它更多的是关于内存分配。它的设计目的是自动创建和销毁对象。

此行:

auto ptr = std::make_unique<const int>(5);

相当于:

auto ptr = new const int{5};

所以在你的行

ptr1 = std::make_unique<const int>(getValue());

ptr1指向一个const int类型的新对象,该对象使用getValue((返回的值初始化。

并且您不会在程序中更改此值。如果你这样尝试:

*ptr.get() += 1;

您将得到编译错误,因为int是const。

相关内容

  • 没有找到相关文章

最新更新