为变量制作副本

时间:2012-04-11 18:37:03

标签: c++ pointers copy

考虑这段代码:

int *a, *b;
a = foo();
if (a)
   b = a;
a = bar();

问题是,当a通过调用bar()进行更新时,b也会更新。但是,我想使用b = a进行备份。那么问题是什么?

4 个答案:

答案 0 :(得分:1)

您可以备份a:

的值
int *a, b;
a = foo();
if (a)
   b = *a;
a = bar();

或者如果您想将b保留为指针:

...
   *b = *a;
...

答案 1 :(得分:0)

int *a, *b;
b = new int;

a = foo();
if (a)
   *b = *a;
a = bar();
...
delete(b);

(地址a的值分配给地址b的值。)

你现在正在做的是让a和b指向内存中相同的位置。然后,如果更新a或b中的值,则它们指针都指向新值。

顺便说一下,除非bar()返回指针,否则您可能需要*a = foo()*a = bar()

答案 2 :(得分:0)

如果a == b,则bar()正在更改a的值,而不是指定新的a。这使得记忆最明显。如果你关心的是实际的整数,而不是地址,而不是分配b = a assign * b = * a。

答案 3 :(得分:0)

在...

int *a;
// ...
a = foo();
如果函数声明为int foo();

...甚至不会编译,所以我假设它被声明为int* foo();。同上int* bar();

不要返回像这样的原始指针。可能不清楚调用者是否应该delete。好的文档只能部分解决这个问题(人类有时会忽略文档)。为什么不只是复制整数,或者至少将引用返回到整数,以防真正需要共享?

话虽如此,在您的特定情况下,foo()bar()显然在内部使用相同的int“对象”,因此a继续指向与{{1}相同的对象即使在b修改后也是如此。