将shared_ptr设置为指向现有对象

Shi*_*bli 6 c++ vector shared-ptr c++11

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

Che*_*Alf 9

使用a shared_ptr作为自动分配的对象没有多大意义.

从技术上讲,你可以通过给出shared_ptr一个没有做任何事情的删除器,并将你vtx变成一个向量的共享指针const向量来做到这一点.

例如,将声明更改为

vector < shared_ptr <Vector3 const> > vtx;
Run Code Online (Sandbox Code Playgroud)

并添加如下指针:

vtx.push_back( shared_ptr<Vector3 const>( &vt, [](Vector3 const*){} ) );
Run Code Online (Sandbox Code Playgroud)

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

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


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

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

一般来说. 在此输入图像描述