使用 * 的智能指针行为

Smart Pointer behavior using *

本文关键字:指针 智能 使用      更新时间:2023-10-16

我有以下代码片段:

QList<const GLMeshPtr*> meshList;
m_itemsList->getSelectedMeshes(meshList);
for (auto m : meshList)
{
if (GLBodyPtr c = (*m)->getStandard()) {
c->executeMeshFix();
}
}

GLMeshPtr设置如下typedef

typedef std::shared_ptr<GLMesh> GLMeshPtr;

m_itemsList->getSelectedMeshes的定义是:

void QMeshList::getSelectedMeshes(QList<const GLMeshPtr*>& list)
{
for (auto& m : m_meshList) {
if (m->isSelected()) {
list.push_back(m->getGLMesh());
}
}
}

getGLMesh的定义是:

const GLMeshPtr* getGLMesh() const { return &m_glmesh; } // where m_glmesh is a GLMeshPtr.

我的问题很简单,但是,我找不到任何参考资料。*关键字是否一定会在堆栈中创建值的副本,或者它是否使用值"就地"?

我更具体地谈论这一行:

if (GLBodyPtr c = (*m)->getStandard()) {

我是否正在创建不必要的 GLBodyptr 副本?我不希望这里的任何人分享指针。

不,* 运算符返回一个引用,即GLBodyPtr const&.之所以const,是因为指针被声明为指向 const 对象。请参阅 cppreference.com 上std::shared_ptr::operator*的定义。

引用基本上就像指针一样,一旦初始化就无法更改,因此它不是shared_ptr对象的副本。