【发布时间】: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(&mSurface, &yuvbuf.mSurface, pSize);-- 你为什么要复制到指针的地址?那应该是:memcpy(mSurface, yuvbuf.mSurface, pSize);。另外,mfxFrameSurface1是什么?如果这不是 POD 类型,那么memcpy是错误的开始方法。 -
您可能希望消除内存管理的麻烦并使用
std::vector<mfxFrameSurface1> 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++