在方法调用参数中创建对象是否返回空对象



假设我有一个包含模型类的头文件

class Model
{
public:
vector<Texture> textures_loaded;
vector<Mesh>    meshes;
string directory;
Model() {}
Model(string const& path)
{
/* Code */
}
}

实体类:

class Entity
{
public:

Entity(Model* model, glm::mat4 matrix) {
this->entityModel = model;
this->modelMatrix = matrix;
}
void Draw(Shader& shader) {
/* Code */
}
Model* entityModel;
glm::mat4 modelMatrix;

};

实体向量如下。

vector<Entity> entities;

以下两段代码在C++中是否不相同?

Model modelPlayer = Model("some param");
entities.push_back(Entity(&modelPlayer, player1_matrix));
entities.push_back(Entity(&Model("some param"), player1_matrix));

当使用第二段代码使用调试器时,Model中的所有字段都未初始化/为空(例如网格(?这几乎就像是在收集垃圾,但我无法正确地制定问题,无法在网上找到答案。

在C++中要学习的关键是作用域。当变量超出范围时,它将被销毁,并有效地变为重影。你可能可以在短时间内使用它的幽灵形式,但它是未定义的行为,因为内存可以在没有通知的情况下被覆盖。

问题是你使用的是一个临时地址,它几乎立刻就超出了范围。你需要坚持更长时间。一种解决方案是CCD_ 1;垃圾收集";各种机制:

std::shared_ptr<Model> modelPlayer = std::make_shared<Model>(Model("some param"));
entities.push_back(Entity(modelPlayer, player1_matrix));

共享指针覆盖*->运算符,因此在使用时,它的行为与原始指针一样透明。

在接收端匹配该类型很重要的地方,当然:

class Entity
{
public:
Entity(std::shared_ptr<Model> model, glm::mat4 matrix) : entityModel(model), modelMatrix(matrix) {
}
std::shared_ptr<Model> entityModel;
}

请注意此处使用的构造函数列表。此外,this->部分仅在存在变量阴影问题时使用,通常不需要也不推荐使用。

当对该指针的最后一次引用超出范围时,该对象将自动清理。换句话说,这个特定模型的寿命与最后一个使用它的实体一样长

最新更新