gpt4 book ai didi

C++从带有&返回指向未初始化结构的指针的 vector 获取结构

转载 作者:行者123 更新时间:2023-11-27 22:58:17 28 4
gpt4 key购买 nike

structFromVector() 函数从结构 vector 返回一个结构。如果你编译下面的代码,那么 foo1Ptr->a 是一个空 vector ,但是 foo2Ptr->a 是一个唯一元素为 1 的 vector 。为什么不是在第一种情况下初始化结构?

如果 a 是一个 int 而不是 vector 而不是 a.push_back(1); 你使用 a = 1;,那么 foo1Ptr->afoo2Ptr->a 都等于 1。为什么它适用于这种情况而不适用于第一种情况?

struct Foo {
std::vector<int> a;

Foo() {
a.push_back(1);
}
};

std::vector<Foo> fooList;

Foo structFromVector() {
return fooList[0];
}

int main() {
fooList.push_back(Foo());

Foo * foo1Ptr = &structFromVector();

Foo foo2 = structFromVector();
Foo * foo2Ptr = &foo2;
}

最佳答案

您正试图在此处使用临时 Foo 对象初始化指针:

Foo * foo1Ptr = &structFromVector();

你的编译器应该拒绝这段代码(获取临时地址。)

如果要编译,在这一行之后,可以想象 foo1Ptr 将指向一个不存在的对象(它将是一个悬挂指针)。取消引用它会调用未定义的行为。不过,讨论不符合规范的实现会做什么是相当推测性的。

因此,即使您的编译器允许您这样做,也不要将指针绑定(bind)到临时对象。

一个解决方案(可能是您打算做的)是返回对 vector 元素的引用:

Foo& structFromVector() {
return fooList[0];
}

只要您不对 vector 执行使其无效的操作(例如,增加其大小以便重新分配),此引用就有效。

关于C++从带有&返回指向未初始化结构的指针的 vector 获取结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30394023/

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