将shared_ptr设置为指向现有对象

时间:2014-06-04 23:16:36

标签: c++ c++11 vector shared-ptr

对于下面的代码,我想知道如何设置std::shared_ptr以指向两个成员函数中的给定对象。在main函数中分配的Vector3对象在程序结束之前不会被删除。

#include <memory>
#include <vector>

using std::vector;
using std::shared_ptr;

class Vector3
{
    // ...
};

class Face
{
    vector < shared_ptr <Vector3> > vtx;

    public:

    void addVtx (const Vector3& vt)
    {
        // vtx.push_back (); <-- how to push_back ?
    }

    void setVtx (const int v, const Vector3& vt)
    {
        if ( vtx.size() > 0 && v < vtx.size() )
        {
            // vtx[v] = &vt; <-- how to assign ?
        }
    }

};

int main ()
{
    vector <Vector3> vec (3);
    Face face;

    face.addVtx (vec[0]);
    face.setVtx (0, vec[0])

    return 0;
}

2 个答案:

答案 0 :(得分:7)

shared_ptr用于自动分配的对象没有多大意义。

技术上你可以通过给shared_ptr一个没有做任何事情的删除器,并将你的vtx更改为共享指针的向量来实现它到const向量。

E.g。将声明更改为

vector < shared_ptr <Vector3 const> > vtx;

并添加如下指针:

vtx.push_back( shared_ptr<Vector3 const>( &vt, [](Vector3 const*){} ) );

免责声明:未经测试的代码,未被编译器触及。

但是,除非您还要添加指向需要删除的向量的指针,否则只需使用原始指针向量。或者,只使用向量向量,并复制数据。


使用原始指针来保持所有权并不是一个好主意。为此使用智能指针。

但相反,使用所有权智能指针来保存对静态或自动对象的纯引用并不是一个好主意。为此,请使用原始指针或引用。

总的来说。 enter image description here

答案 1 :(得分:0)

无论是否使用shared_ptr是一个好主意,如接受的答案所解释,如果您继续使用shared_ptr,则可以使用以下内容:

void addVtx (const Vector3& vt)
{
    vtx.push_back(std::make_shared<Vector3>(vt));
}

void setVtx (size_t v, const Vector3& vt)
{
    if ( vtx.size() > 0 && v < vtx.size() )
    {
       vtx[v] = std::make_shared<Vector3>(vt);
    }
}