考虑这段代码:
int *a, *b;
a = foo();
if (a)
b = a;
a = bar();
问题是,当a
通过调用bar()
进行更新时,b
也会更新。但是,我想使用b = a
进行备份。那么问题是什么?
答案 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
修改后也是如此。