编译器删除引用返回的向量 [duplicate]

Compiler Removes Vector Returned By Reference [duplicate]

提问人:Ryoku 提问时间:3/16/2018 更新时间:3/16/2018 访问量:129

问:

不太确定为什么会发生这种情况,但我有以下代码:

vector<glm::vec3>& HeightMap::Vec3Vertices() {
    vector<glm::vec3> vecs;
    for (unsigned int i = 0; i < vertices.size(); i += 3) {
        vecs.push_back(glm::vec3(vertices[i], vertices[i + 1], vertices[i + 2]));
    }
    return vecs;
}

现在,在我的主代码中,我有:

vector<glm::vec3>& vertices = hm.Vec3Vertices();

其中 是 Height Map 对象。hm

我处于发布模式

我稍后使用,当我这样做时,大小是正确的,但其中的所有数据都是不可读的。当我单步执行代码时,编译器似乎已经优化了 in 的初始化verticesvecsVec3Vertices()

另一方面,如果我更改它,以便我不会通过引用

vector<glm::vec3> HeightMap::Vec3Vertices() {

vector<glm::vec3> vertices = hm.Vec3Vertices();

一切都很完美。关于为什么会这样,有什么想法吗?我知道无论如何,按值传递可能会导致编译器使用移动操作,我只是一辈子都无法弄清楚为什么我的引用传递首先是无效的。提前致谢

C++ Vector C++14 传递引用 版本

评论

1赞 NathanOliver 3/16/2018
永远不要返回对本地对象的引用。当函数结束时,对象将被销毁。
1赞 Justin 3/16/2018
返回一个悬空的引用。stackoverflow.com/q/46011510/1896169
1赞 Ryoku 3/16/2018
但是向量只是指向堆上数据的指针,那么为什么我不能将其传回呢?我的意思是数据仍然在堆上,不是吗?同样,我应该使用什么语义来确保使用移动?
3赞 NathanOliver 3/16/2018
是的,向量的析构函数在指针被销毁时会删除指针
1赞 juanchopanza 3/16/2018
因为向量不仅仅是指向堆上数据的指针。

答: 暂无答案