vector 存放指向数组的指针 内存释放出错

acexiaoe 2014-05-07 08:23:20
定义了一个结构

struct SV
{
float x,y,z;
};

又定义了一个类

class SVHolder
{
SV* apV;
int nV;
};

现在有一个vector <SVHolder*> m_v;
是这样使用的:

SVHolder* pNewHolder = new SVHolder;
pNewHolder->apV = new SV[5];
// 省略为SV[5]的赋值操作代码



现在轮到释放m_v内存的时候了,我是这么做的:

for( int i = 0; i < m_v.size(); ++i )
{
SVHolder* pTmpHolder = m_v.at(i);
delete[] pTmpHolder->apV;
apV = NULL;
delete pTmpHolder;
pTmpHolder = NULL;
}
m_v.clear();


这样程序退出时,在m_v.clear()下一步下断点没有问题,但是继续运行就会出现VA location的类似错误
注释掉这段释放内存的代码就不会报错,当然了,必然会有内存泄露了
请问这是为什么呢
...全文
141 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
acexiaoe 2014-05-07
  • 打赏
  • 举报
回复
引用 2 楼 Blizzard_whx 的回复:
首先,楼主代码中发现几个明显错误 SV* apV; //这里是私有成员,对象无法访问 apV = NULL; // 应该为pTmpHolder->apV = NULL;
嗯,代码手打的时候疏忽了,急着解决问题了 感谢您的热心回复~问题找到了,是利用=拷贝class SVHolder的时候没有对其中的vector进行单独的处理,由于浅拷贝使得两个对象的apV指向了同一内存,析构的时候没有注意,于是析构了两遍,自己的疏忽,让您费心重做了一遍,再次感谢
引用 1 楼 u012061345 的回复:
继续运行是运行什么代码?
继续运行是_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)错误,这个错误是由于再次试图删除已经释放过的指针导致的,同样感谢您
废玻璃渣 2014-05-07
  • 打赏
  • 举报
回复
首先,楼主代码中发现几个明显错误 1. class SVHolder { SV* apV; //这里是私有成员,对象无法访问 int nV; }; 2. for( int i = 0; i < m_v.size(); ++i ) { SVHolder* pTmpHolder = m_v.at(i); delete[] pTmpHolder->apV; apV = NULL; // 应该为pTmpHolder->apV = NULL; delete pTmpHolder; pTmpHolder = NULL; } m_v.clear(); 其次,经过对错误的修改后,我自己测试运行并没发现错误,我的代码如下:
#include "stdafx.h" #include <vector> #include <iostream> using namespace std; struct SV { float x,y,z; }; class SVHolder { public: SV* apV; int nV; }; int _tmain(int argc, _TCHAR* argv[]) { vector<SVHolder*> v; for(int i = 0; i < 5; i++) { SVHolder* pNewHolder = new SVHolder; pNewHolder->apV = new SV[5]; v.push_back(pNewHolder); } for( int j = 0; j < 5; ++j ) { SVHolder* pTmpHolder = v.at(j); delete[] pTmpHolder->apV; pTmpHolder->apV = NULL; delete pTmpHolder; pTmpHolder = NULL; } v.clear(); cin.get(); return 0; } 这样虽然没错,但是建议类成员的析构最好还是在析构函数中完成
罗博士 2014-05-07
  • 打赏
  • 举报
回复
继续运行是运行什么代码?

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧