gpt4 book ai didi

C++ 返回在堆上创建的对象并修改它,不改变它吗?

转载 作者:行者123 更新时间:2023-11-27 22:51:57 24 4
gpt4 key购买 nike

我有以下代码

#include <iostream>
#include <vector>
using namespace std;

struct foo {
struct bar {
int foobar;
};

vector<bar*> barp;

bar & insert(int v){
bar * b = new bar();
(*b).foobar = v;
barp.push_back(b);
return *b;
}

void edit(bar & b, int v){
b.foobar = v;
}
};

int main() {
foo f;
foo::bar b = f.insert(5);
f.edit(b, 10);
std::cout << (b.foobar == 10?"true":"false") << std::endl;//now ok
std::cout << (b.foobar == 5?"true":"false") << std::endl;//now ok
std::cout << ((*f.barp[0]).foobar == 10?"true":"false") << std::endl;//after edit, still returns false
std::cout << ((*f.barp[0]).foobar == 5?"true":"false") << std::endl;//after edit, returns true
return 0;
}

谁能解释一下,为什么“b.foobar”没有变成 10? b不是和f.barp[0]中保存的地址一样吗?

编辑:感谢您的回答,添加对 void edit(bar & b, int v) 的引用当然有意义。然而,添加对“bar & insert”的引用似乎并没有改变任何东西,因为 (*f.barp[0]).foobar 在编辑后保持不变,即使 insert 现在应该返回引用。

最佳答案

Doesn't the b have the same address as the one saved in f.barp[0]?

不,它没有。您从插入中按值返回对象,即

bar insert(int v)
^^^

按值返回意味着一个拷贝:使用复制构造函数构造一个新的bar,并丢弃原始的*

要获得您期望的结果,请从 insert 返回 bar&:

bar& insert(int v) {
// ^
}

同样,如果您希望所有函数都在同一个对象上工作,edit 应该通过引用获取其参数。

* 如果不是将指针存储在集合中,这也会造成内存泄漏。您的程序也确实存在内存泄漏,但您可以通过删除 barp vector 中的对象来修复它。

关于C++ 返回在堆上创建的对象并修改它,不改变它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36392524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com