如何将结构深层复制到向量的每个元素

时间:2018-08-10 19:33:26

标签: c++ c++11 visual-c++

嗨,我正在尝试对向量中的每个元素进行结构的完整深层复制,但即时通讯没有太大成功

这是我的结构

struct YUV_Buffer
{
    mfxFrameSurface1  *mSurface; //structor for video info and data
    int pSize;
    YUV_Buffer(mfxFrameSurface1 *pBuf, int  pSize) :pSize(pSize)

    {
        mSurface = new mfxFrameSurface1[pSize];
        memcpy(&mSurface, &pBuf, pSize);
    }

    YUV_Buffer(const YUV_Buffer & yuvbuf)

    {
        mSurface = new mfxFrameSurface1[yuvbuf.pSize];
        pSize = yuvbuf.pSize;
        memcpy(&mSurface, &yuvbuf.mSurface, pSize);
    }
    ~YUV_Buffer() {
        //if(mSurface != NULL)
        delete[] mSurface;
        mSurface = { 0 };

    }
};

这就是即时通讯方式

vector<YUV_Buffer> mBuffer;
YUV_Buffer root(pVPPSurfacesOut[nSurfIdxOut],sizeof(pVPPSurfacesOut[nSurfIdxOut]));
mBuffer.push_back(root);

pVPPSurfacesOut [nSurfIdxOut]是一种称为mfxFrameSurface1的结构,其中包含视频帧信息和视频帧数据,我需要将完整的结构内容复制到向量中的每个元素,而不会覆盖前一个元素。

我的复制结构的问题是第二次迭代后,该结构在析构函数〜YUV_Buffer()delete [] mSurface上崩溃了;在YUV_Buffer中

谁能帮我指出正确的方向 问候 奈杰尔

1 个答案:

答案 0 :(得分:0)

您有几个问题。

1:应使用指针而不是指针地址来调用memcpy:

memcpy(mSurface, pBuf, pSize);

2:您需要实施3/5 https://en.cppreference.com/w/cpp/language/rule_of_three规则并实现或删除赋值运算符。

两个问题的解决方案是将mfxFrameSurface1替换为std::vector,它可以为您进行内存管理和复制:

struct YUV_Buffer
{
    std::vector< char >  mSurface; //structor for video info and data

    YUV_Buffer(const std::vector< char >& surface) :mSurface(surface)
    {
    }

    // YUV_Buffer(const YUV_Buffer & yuvbuf) = default; // no need to implement the copy constructor the automatic one does it all for you
    // ~YUV_Buffer() = default; // don't need a destructor either
};