new 了个 vector,delete的时候出错了?试了许多次都没办法,求助大神

酱油游击队 2018-01-15 10:45:53
bool CDataOperation::ReadCheckStdLib(string m_table,string &m_PCBName,string &m_LayerName,vector<StdLib> &StdTest)
{
string SqlStr = "select * from " + m_table;
m_pRecordset = m_pConnection->Execute((_bstr_t)SqlStr.c_str(),NULL, adCmdText);
try
{
if(!m_pRecordset->adoEOF)
{
m_PCBName = (_bstr_t)(m_pRecordset->GetCollect("PCBname"));
m_LayerName = (_bstr_t)(m_pRecordset->GetCollect("LayerName"));
long lDataSize = m_pRecordset->GetFields()->GetItem("StdLib")->ActualSize;/// ///得到数据的长度
char *pData = NULL;//new char[lDataSize];
//BYTE* m_pBMPBuffer = new BYTE[lDataSize];//NULL;
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB = m_pRecordset->GetFields()->GetItem("StdLib")->GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1)) ///判断数据类型是否正确
{

SafeArrayAccessData(varBLOB.parray,(void **)&pData);
vector<StdLib2>* StdTest2 = new vector<StdLib2>; //是否需要delete 怎么delete
StdTest2->resize(lDataSize/sizeof(StdLib2));
memcpy(StdTest2->data(),pData,lDataSize);

StdLid_StringToCString(StdTest2,StdTest);
SafeArrayUnaccessData (varBLOB.parray);
delete StdTest2 ;
}
}
return true;
}
else
{
return false;
}
}
catch(_com_error e)
{
return false;
}
}
void CDataOperation::StdLid_StringToCString(vector<StdLib2>* StdTest2,vector<StdLib> &StdTest)
{
for(int i = 0;i < StdTest2->size();i++) // StdLid sting to CString
{
StdLib Lib2;
Lib2.nId = StdTest2[0][i].nId;
Lib2.nTestMode = StdTest2[0][i].nTestMode;
for(int l = 0;l<4;l++)
{
Lib2.LibData[l].dfBtmValue = StdTest2[0][i].LibData[l].dfBtmValue;
Lib2.LibData[l].dfStdValue = StdTest2[0][i].LibData[l].dfStdValue;
Lib2.LibData[l].dfTopValue = StdTest2[0][i].LibData[l].dfTopValue;
}
//USES_CONVERSION;
Lib2.strName = (CString)StdTest2[0][i].strName.c_str();

StdTest.push_back(Lib2);
}
}
class StdLib
{
public:
int nId;
CString strName; // 标准名称
MEASURETYPE nTestMode; // 测量模式
StandardItem LibData[4]; // 标准库
};
class StdLib2
{
public:
int nId;
std::string strName; // 标准名称
MEASURETYPE nTestMode; // 测量模式
StandardItem2 LibData[4]; // 标准库
};
...全文
584 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2018-01-17
  • 打赏
  • 举报
回复
1、既然你用c++,就应该用c++的内存管理方式,而不是c的, 因为一个c++ 的class 当创建它的实例是并不是简单返回一个与它大小相符的一段内存,而是 先创建内存,再调用构造函数,销毁它的时候,不是简单free,而是先调用析构函数,再释放内存。 所以,你直接memcpy了,就失去了构造函数的创建过程。 2、vector 一般使用push_back ,而不是直接对data memcpy ,因为用push_back 会自动调用哪个类的拷贝构造函数,对vector 的delete会自动调用它容器内的对象的析构函数。因为你直接memcpy了,容器内的对象并没有构造好,对一个没构造好的对象,delete vector 时 ,调用析构函数非常有可能出错 3、看了你的代码,似乎是把一个对象存入数据库 class StdLib { public: int nId; CString strName; // 标准名称 MEASURETYPE nTestMode; // 测量模式 StandardItem LibData[4]; // 标准库 }; class StdLib2 { public: int nId; std::string strName; // 标准名称 MEASURETYPE nTestMode; // 测量模式 StandardItem2 LibData[4]; // 标准库 }; 这里的问题很大。StandardItem2 里面有一个string成员。string是对char* 的封装。里面肯定有个char* 指针。你把这个指针存入数据库,有意义吗?下一次读出来其实他已经失效了。
真相重于对错 2018-01-17
  • 打赏
  • 举报
回复
vector<StdLib2>* StdTest2 = new vector<StdLib2>; //是否需要delete 怎么delete StdTest2->resize(lDataSize/sizeof(StdLib2)); memcpy(StdTest2->data(),pData,lDataSize); 对 vector的data 直接memcpy 纯粹是找死!
酱油游击队 2018-01-17
  • 打赏
  • 举报
回复
[code=clong lDataSize = m_pRecordset->GetFields()->GetItem("StdLib")->ActualSize;/// ///得到数据的长度 char *pData = NULL;//new char[lDataSize]; //BYTE* m_pBMPBuffer = new BYTE[lDataSize];//NULL; if(lDataSize > 0) { _variant_t varBLOB; varBLOB = m_pRecordset->GetFields()->GetItem("StdLib")->GetChunk(lDataSize); if(varBLOB.vt == (VT_ARRAY | VT_UI1)) ///判断数据类型是否正确 { //char pData[] = SafeArrayAccessData(varBLOB.parray,(void **)&pData); vector<StdLib2> StdTest2; StdLib2 *pLib; long pLiblen = sizeof(StdLib2); char *pData2 = new char[pLiblen]; for(int i = 0;i < lDataSize/sizeof(StdLib2) ;i++) { memcpy(pData2,pData+(i*pLiblen),pLiblen); pLib = (StdLib2*)((void *)pData2); StdTest2.push_back(*pLib); } delete[] pData2; StdLid_StringToCString(&StdTest2,StdTest); SafeArrayUnaccessData (varBLOB.parray); //StdTest2.clear(); //delete[] pVector; //delete StdTest2; } }][/code]
酱油游击队 2018-01-17
  • 打赏
  • 举报
回复
多谢各位大神 问题解决了
long lDataSize = m_pRecordset->GetFields()->GetItem("StdLib")->ActualSize;/// ///得到数据的长度 char *pData = NULL;//new char[lDataSize]; //BYTE* m_pBMPBuffer = new BYTE[lDataSize];//NULL; if(lDataSize > 0) { _variant_t varBLOB; varBLOB = m_pRecordset->GetFields()->GetItem("StdLib")->GetChunk(lDataSize); if(varBLOB.vt == (VT_ARRAY | VT_UI1)) ///判断数据类型是否正确 { //char pData[] = SafeArrayAccessData(varBLOB.parray,(void **)&pData); vector<StdLib2> StdTest2; StdLib2 *pLib; long pLiblen = sizeof(StdLib2); char *pData2 = new char[pLiblen]; for(int i = 0;i < lDataSize/sizeof(StdLib2) ;i++) { memcpy(pData2,pData+(i*pLiblen),pLiblen); pLib = (StdLib2*)((void *)pData2); StdTest2.push_back(*pLib); } delete[] pData2; StdLid_StringToCString(&StdTest2,StdTest); SafeArrayUnaccessData (varBLOB.parray); //StdTest2.clear(); //delete[] pVector; //delete StdTest2; } }
赵4老师 2018-01-15
  • 打赏
  • 举报
回复
小心驶得万年船。
满衣兄 2018-01-15
  • 打赏
  • 举报
回复
memcpy的时候内存越界了。 StdTest2->resize(lDataSize/sizeof(StdLib2)); memcpy(StdTest2->data(),pData,lDataSize); 改为: StdTest2->resize(lDataSize); memcpy(StdTest2->data(),pData,lDataSize);
幻夢之葉 2018-01-15
  • 打赏
  • 举报
回复
就这样子delete,估计是你那个memcpy有问题。resize这个函数你要注意下,当容量小于resize的大小的时候,会失败的。 所以你的代码中没有直接或者间接给vector分配内存的 你应该在构造的时候指定初始有多个个元素 vector<StdLib2>* StdTest2 = new vector<StdLib2>(lDataSize/sizeof(StdLib2)); 或者使用reserve函数 StdTest2->reserve(lDataSize/sizeof(StdLib2)); //这个函数当容量不够的时候会重新分配更大的内存,有别于resize函数
jiht594 2018-01-15
  • 打赏
  • 举报
回复
你改成vector<int>试试、也会这样吗? 你把new和detele之间的代码删掉也这样吗?
幻夢之葉 2018-01-15
  • 打赏
  • 举报
回复
引用 10 楼 jianwen0529 的回复:
[quote=引用 9 楼 qq_35369065 的回复:] [quote=引用 2 楼 jianwen0529 的回复:] 就这样子delete,估计是你那个memcpy有问题。resize这个函数你要注意下,当容量小于resize的大小的时候,会失败的。 所以你的代码中没有直接或者间接给vector分配内存的 你应该在构造的时候指定初始有多个个元素 vector<StdLib2>* StdTest2 = new vector<StdLib2>(lDataSize/sizeof(StdLib2)); 或者使用reserve函数 StdTest2->reserve(lDataSize/sizeof(StdLib2)); //这个函数当容量不够的时候会重新分配更大的内存,有别于resize函数
使用reserve 的时候 delete 不会出错,但StdTest2里面没有数据,memcpy后也没有数据[/quote] reserve是分配容量,之后你再resize调整大小。试试看[/quote] 数据是存在的,只是因为end指针还是指向begin那里,所以遍历不出来
幻夢之葉 2018-01-15
  • 打赏
  • 举报
回复
引用 9 楼 qq_35369065 的回复:
[quote=引用 2 楼 jianwen0529 的回复:] 就这样子delete,估计是你那个memcpy有问题。resize这个函数你要注意下,当容量小于resize的大小的时候,会失败的。 所以你的代码中没有直接或者间接给vector分配内存的 你应该在构造的时候指定初始有多个个元素 vector<StdLib2>* StdTest2 = new vector<StdLib2>(lDataSize/sizeof(StdLib2)); 或者使用reserve函数 StdTest2->reserve(lDataSize/sizeof(StdLib2)); //这个函数当容量不够的时候会重新分配更大的内存,有别于resize函数
使用reserve 的时候 delete 不会出错,但StdTest2里面没有数据,memcpy后也没有数据[/quote] reserve是分配容量,之后你再resize调整大小。试试看
酱油游击队 2018-01-15
  • 打赏
  • 举报
回复
引用 2 楼 jianwen0529 的回复:
就这样子delete,估计是你那个memcpy有问题。resize这个函数你要注意下,当容量小于resize的大小的时候,会失败的。 所以你的代码中没有直接或者间接给vector分配内存的 你应该在构造的时候指定初始有多个个元素 vector<StdLib2>* StdTest2 = new vector<StdLib2>(lDataSize/sizeof(StdLib2)); 或者使用reserve函数 StdTest2->reserve(lDataSize/sizeof(StdLib2)); //这个函数当容量不够的时候会重新分配更大的内存,有别于resize函数
使用reserve 的时候 delete 不会出错,但StdTest2里面没有数据,memcpy后也没有数据
酱油游击队 2018-01-15
  • 打赏
  • 举报
回复
引用 2 楼 jianwen0529 的回复:
就这样子delete,估计是你那个memcpy有问题。resize这个函数你要注意下,当容量小于resize的大小的时候,会失败的。 所以你的代码中没有直接或者间接给vector分配内存的 你应该在构造的时候指定初始有多个个元素 vector<StdLib2>* StdTest2 = new vector<StdLib2>(lDataSize/sizeof(StdLib2)); 或者使用reserve函数 StdTest2->reserve(lDataSize/sizeof(StdLib2)); //这个函数当容量不够的时候会重新分配更大的内存,有别于resize函数
试了你的方法 前面一个没用 使用 reserve 函数,StdTest2 变量里面就没有数据了
酱油游击队 2018-01-15
  • 打赏
  • 举报
回复
引用 3 楼 yfqvip 的回复:
memcpy的时候内存越界了。 StdTest2->resize(lDataSize/sizeof(StdLib2)); memcpy(StdTest2->data(),pData,lDataSize); 改为: StdTest2->resize(lDataSize); memcpy(StdTest2->data(),pData,lDataSize);
试了一下 好像不行
满衣兄 2018-01-15
  • 打赏
  • 举报
回复
引用 5 楼 qq_35369065 的回复:
我试了 不加 delete 不会出错,程序运行也能得到想要的结果 我把 delete StdTest2 ; 放到 StdTest2->resize(lDataSize/sizeof(StdLib2)); 后面不会出错, 一放到 memcpy(StdTest2->data(),pData,lDataSize); 后面就出错 去掉 delete 不会出错,程序运行也能得到想要的结果
这只是你运气好,正常来讲在memcpy的时候就出问题了。虽然正常运行了,但是还是存在潜在的问题,换个机器或者编译一个release版本就可能崩溃了。
酱油游击队 2018-01-15
  • 打赏
  • 举报
回复
我试了 不加 delete 不会出错,程序运行也能得到想要的结果 我把 delete StdTest2 ; 放到 StdTest2->resize(lDataSize/sizeof(StdLib2)); 后面不会出错, 一放到 memcpy(StdTest2->data(),pData,lDataSize); 后面就出错 去掉 delete 不会出错,程序运行也能得到想要的结果

64,663

社区成员

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

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