嗨,我正在尝试对向量中的每个元素进行结构的完整深层复制,但即时通讯没有太大成功
这是我的结构
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中
谁能帮我指出正确的方向 问候 奈杰尔
答案 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
};