c++ - 将 shared_ptr 设置为指向现有对象

标签 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;
}

最佳答案

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

技术上您可以做到这一点,方法是为 shared_ptr 提供一个不执行任何操作的删除器,并将您的 vtx 更改为指向 const vector 的共享指针的 vector 。

例如将声明更改为

vector < shared_ptr <Vector3 const> > vtx;

并像这样添加一个指针:

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

免责声明:未经测试的代码,未经编译器修改。

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


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

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

一般来说。 enter image description here

关于c++ - 将 shared_ptr 设置为指向现有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24049155/

相关文章:

c++ - 在 nullptr 上调用 OpenSSL BIO/EC_KEY/EVP_KEY/..._free 函数是否安全?

c++ - 如何以 C++11 样式初始化数组?

c++ - 解析二进制文件所需的帮助

c++ - 字符串到枚举类的失败证明转换

c++ - 在输出参数中使用 auto

c++ - 我们可以使用 std::vector 定义一个固定宽度的二维矩阵吗?

C++ 清除指向动态分配对象的指针 vector 会导致异常?

c++ - 如何访问脚本中定义的类型的成员?

c++ - 警告 : returning reference to temporary - strange case (Clarification for Rvalue)

c++ - g++内部编译器错误段错误与递归constexpr