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不知道,所以最好不要建议他在不最终释放内存的情况下分配内存是可以的。