考虑这段代码:
int *a, *b;
a = foo();
if (a)
b = a;
a = bar();
问题是,当a
通过调用更新时bar()
,b
也会更新。但是我想使用b = a
. 那有什么问题呢?
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()
。
您可以只备份 a 的值:
int *a, b;
a = foo();
if (a)
b = *a;
a = bar();
或者如果您想保留b
为指针:
...
*b = *a;
...
如果 a == b,则 bar() 正在更改 a 的值,而不是分配新的 a。这使记忆最有意义。如果您关心的是实际整数,而不是地址,而不是分配 b = a 分配 *b = *a。
这...
int *a;
// ...
a = foo();
...如果函数被声明为 ,甚至不会编译int foo();
,所以我假设它被声明为int* foo();
. 同上int* bar();
。
不要像这样返回原始指针。调用者是否应该delete
这样做可能不清楚。好的文档只能部分解决这个问题(人类不时有忽视文档的倾向)。为什么不直接复制整数值,或者至少返回对整数的引用以防它真的需要共享?
话虽这么说,在您的特定情况下,foo()
并且bar()
显然在内部使用相同的 int “对象”,因此即使在修改它之后a
仍继续指向同一个对象。b
bar()