gpt4 book ai didi

c++ - 什么时候将对象值添加到堆上的 vector 是安全的?

转载 作者:行者123 更新时间:2023-11-30 01:32:57 24 4
gpt4 key购买 nike

假设我有一个名为 vertex 的结构,它有一个添加两个顶点的方法:

struct vertex {
float x, y, z;

// constructs the vertex with initial values
vertex(float ix, float iy, float iz);

// returns the value c = this + b
vertex operator+(vertex b);
};

vertex::vertex(float ix, float iy, float iz){
this->x = ix; this->y = iy; this->z = iz;
}

vertex vertex::operator+(vertex b){
vertex c;
c.x = this->x + b.x;
c.y = this->y + b.y;
c.z = this->z + b.z;
return c;
}

在另一个调用函数中,我想将两个顶点相加并将结果添加到 vector<vertex*> 中.什么时候使用返回值添加到给定 vector 是安全的?如果永远不会,我将如何实现?

例如,

vector<vertex*> v;
vertex a(1, 2, 3);
vertex b(4, 5, 6);
v.push_back(&(a + b));

最佳答案

这是不安全的,因为你正在存储一个指向自动或临时变量的指针,当当前函数终止时,它将被回收。

将动态分配的对象与自动分配的对象混合使用是一种严重的风险。有时最好的策略是完全禁止自动分配(例如,通过将构造函数设为私有(private)并使用工厂方法创建新实例)。然后你将负责在某个时候消除这些。

第二种选择(不一定是您想要的)是按值(value)做每件事。有一个 Vertex vector 而不是 Vertex*,并且只在存储顶点时复制它们。你的类的编写方式,所有字段都是原始的,所以这可能已经足够好了,你不会遇到性能或深层复制语义问题。

关于c++ - 什么时候将对象值添加到堆上的 vector 是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/791937/

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