使用*的智能指针行为

时间:2018-07-02 13:15:23

标签: c++ c++11 shared-ptr smart-pointers

我有以下代码段:

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副本?我不想在这里的任何人共享指针。

1 个答案:

答案 0 :(得分:2)

否,*运算符返回引用,即GLBodyPtr const&。之所以为const,是因为该指针被声明为指向const对象。请参见cppreference.comstd::shared_ptr::operator*的定义。

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