【问题标题】:how to deep copy a structure to each element of a vector如何将结构深度复制到向量的每个元素
【发布时间】:2018-08-10 19:33:26
【问题描述】:

您好,我正在尝试对向量中的每个元素进行结构的完整深度复制,但我没有取得太大成功

这是我的结构

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 中

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

【问题讨论】:

  • memcpy(&amp;mSurface, &amp;yuvbuf.mSurface, pSize); -- 你为什么要复制到指针的地址?那应该是:memcpy(mSurface, yuvbuf.mSurface, pSize);。另外,mfxFrameSurface1 是什么?如果这不是 POD 类型,那么 memcpy 是错误的开始方法。
  • 您可能希望消除内存管理的麻烦并使用std::vector&lt;mfxFrameSurface1&gt; mSurface;
  • 另外,问题不在于vector。您很可能通过仅创建一个对象并尝试复制、分配和销毁该对象来复制错误。类似于此{YUV_Buffer buf; /* fill it with data */ YUV_Buffer buf2(buf); YUV_Buffer buf3; buf3 = buf;}
  • delete[] mSurface; mSurface = {0}; - 第二个陈述毫无意义。你删除了mSurface,现在无论它的值如何,对它的所有访问都无效,那么为什么还要将它设置为0?即使在析构函数中,mSurface 也不会立即存在,因此它的值无关紧要。
  • 当你说pSize时,你说的是类成员变量,还是传递给函数的参数?编译器通常可以从上下文中准确判断出你的意思,但读者可能不会

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


【解决方案1】:

你有几个问题。

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

memcpy(mSurface, pBuf, pSize);

2:需要实现3/5https://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
};

【讨论】:

  • 感谢您的意见我已遵循 rule_of_three 解决方案,现在我的崩溃已经消失,我将结构更改如下:
猜你喜欢
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多