复制指针,更改副本指向的对象而不更改原始对象?

时间:2019-04-07 15:13:50

标签: c++ pointers memory-address

是否可以复制一个指针,然后在不更改原始指针指向什么的情况下更改其指向的值?

例如,说我有以下内容:

int *i;
auto j = i;

*j = new_val;

这将更改存储在地址i所指向的值,因为ij都指向相同的内存地址,这是我不需要的。

由于此示例案例非常简单,因此我只需创建一个新的int *j而无需复制i。但是在更复杂的情况下,例如链表,我不想重新创建链表。

所以我想我的问题归结为是否有可能复制指针,并将复制点指向其他地址,但保持原始指针的结构完整性吗?

1 个答案:

答案 0 :(得分:2)

首先要澄清一下。指针是一个独立的变量,其中包含一个内存地址。仅此而已。 Poitner的类型意味着程序员(您已告诉编译器)在该地址存储的内容,以便您可以检索在该地址存储的值-这称为解引用。

现在牢记这一点,您应该能够自己确定要做什么,但是让我们逐步完成该过程,并且我们将使用智能指针,因为它们可以帮助我们管理内存:

std::unique_ptr<int> i = std::make_unique<int>(10); 
//Here we created a variable on the heap and gave it a value 10,
//the address of it is stored in **i**

std::unique_ptr<int> j = std::make_unique<int>(*i);
//Here we created a variable on the heap nad gave it a value
//stored at the address in **i**. Notice the dereferencing
//that means we want to copy the value pointed to,
//not the pointer itself.

现在,如果没有智能指针对您更有意义:

int *i = new int(10);
int *j = new int(*i);
delete i;
delete j;

这做同样的事情,但是您需要自己管理内存,例如,当引发异常时,它将泄漏。

现在,这将适用于示例中像int这样琐碎的所有类型,或者定义了复制构造函数的所有类型。编译器通常会自动为您的类型生成一个,除非由于某种原因它不能这样做,在这种情况下,您必须自己提供它:

有关更多详细信息,请参见此处:Copy Constructors

编辑:指针的一些很好的解释,包括演示如何做自己想做的事情:C++ Pointers by TheCherno