2

考虑这段代码:

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

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

4

4 回答 4

1
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()and *a = bar()

于 2012-04-11T18:39:14.703 回答
1

您可以只备份 a 的值:

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

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

...
   *b = *a;
...
于 2012-04-11T18:39:19.237 回答
0

如果 a == b,则 bar() 正在更改 a 的值,而不是分配新的 a。这使记忆最有意义。如果您关心的是实际整数,而不是地址,而不是分配 b = a 分配 *b = *a。

于 2012-04-11T18:41:40.520 回答
0

这...

int *a;
// ...
a = foo();

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

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

话虽这么说,在您的特定情况下,foo()并且bar()显然在内部使用相同的 int “对象”,因此即使在修改它之后a仍继续指向同一个对象。bbar()

于 2012-04-11T18:48:56.217 回答