Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为变量制作副本_C++_Pointers_Copy - Fatal编程技术网

C++ 为变量制作副本

C++ 为变量制作副本,c++,pointers,copy,C++,Pointers,Copy,考虑这段代码: 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中的值被更新,它们

考虑这段代码:

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()
*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()同上

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


也就是说,在您的特定情况下,
foo()
bar()
显然在内部使用相同的int“object”,因此
a
继续指向与
b
相同的对象,即使
bar()
修改了它。

我不理解这个问题。当你说“a更新”和“b也更新”时,你可能会更清楚你的意思。@David Heffernan:我的意思是当
a=bar()
执行时,
b
也会更改为
a
否的新值,这根本不可能。您似乎在断言分配给
a
会导致
b
改变。这是不可能的。您提供的代码片段。你能提供一个完整的程序(尽量简短,10行就可以了)来证明你的问题吗?请参阅。
b
未初始化(即包含未定义的内存地址),因此这将是访问冲突。我在这里没有提供完整的代码,但我想你是对的。修复。现在你有一个内存泄漏。而C++的神则不赞成使用<代码> MalOC 而不是<代码>新< /C> >;我甚至没有意识到这是C++。除息的。。。我不相信我在代码中引入了任何内存泄漏,但如果你能启发我,我将不胜感激。很抱歉挑剔@Zéychin,我相信你知道所有这些,但我认为OP不知道,所以最好不要建议他在不最终释放内存的情况下分配内存是可以的。