想不通,这段简单的代码会运行出错

yhgfriend 2018-11-16 11:34:02
编译通过,运行出错,就是函数会多次调用 SENSORS_ABILITY_FOR_TEST 类的析构函数,多次删除同一指针,导致程序出错。调用析构函数的可能原因是 1 是 临时变量 sa,sb在生命同期结束时调用,2 是vector push_pack时拷贝了 SENSORS_ABILITY_FOR_TEST ,最后vector结束时调用了vector容器里的数据的析构函数,但是问题这都是我具体的需要,我感觉代码没问题呀,我应该怎样写才能正常运行呢


//测试类说明: 类里有一个指针 unsigned char * ,LenOfSpcData保存指针指向内存区的长度
class SENSORS_ABILITY_FOR_TEST{
public:
unsigned char * m_SpcData; //用于保存与传感器类型相关的特殊数据
int LenOfSpcData;

public:
SENSORS_ABILITY_FOR_TEST& operator = (const SENSORS_ABILITY_FOR_TEST &src)
{
LenOfSpcData=src.LenOfSpcData;
if(LenOfSpcData)
{
if(m_SpcData)
delete[] m_SpcData;
m_SpcData=new unsigned char[LenOfSpcData];
memcpy(m_SpcData,src.m_SpcData,LenOfSpcData);
}
else
{
if(m_SpcData)
{
delete[] m_SpcData;
m_SpcData=NULL;
}
}

return *this;
}

SENSORS_ABILITY_FOR_TEST()
{
m_SpcData=NULL;
LenOfSpcData=0;
}

~SENSORS_ABILITY_FOR_TEST()
{
if(m_SpcData)
{
delete[] m_SpcData;
m_SpcData=NULL;
}
}
};

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;

///vector test
SENSORS_ABILITY_FOR_TEST sa;
sa.LenOfSpcData=12;
sa.m_SpcData=new unsigned char[sa.LenOfSpcData];
memset(sa.m_SpcData,1,sa.LenOfSpcData);

SENSORS_ABILITY_FOR_TEST sb;
sb=sa;
memset(sb.m_SpcData,2,sb.LenOfSpcData);

vector<SENSORS_ABILITY_FOR_TEST> m_SENSORS_ABILITY_TEST,m_SENSORS_ABILITY_TEST1;
m_SENSORS_ABILITY_TEST.push_back(sa);
m_SENSORS_ABILITY_TEST.push_back(sb);
m_SENSORS_ABILITY_TEST1=m_SENSORS_ABILITY_TEST;

vector<SENSORS_ABILITY_FOR_TEST>::iterator it=m_SENSORS_ABILITY_TEST.begin();

return 0;


...全文
71 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-11-16
  • 打赏
  • 举报
回复
《C++编程思想》
yhgfriend 2018-11-16
  • 打赏
  • 举报
回复
我 new的是数组,对应的delete[]
schlafenhamster 2018-11-16
  • 打赏
  • 举报
回复
delete[ ] m_SpcData;
为什么是 [ ]
yhgfriend 2018-11-16
  • 打赏
  • 举报
回复
搞定了,加了一个复制构造函数(以前有重载等号运算符,但是不行),谢谢大家 SENSORS_ABILITY_FOR_TEST(const SENSORS_ABILITY_FOR_TEST &a) { m_SpcData=NULL; LenOfSpcData=0; *this=a; }
yhgfriend 2018-11-16
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
https://blog.csdn.net/lujiandong1/article/details/49872697
谢谢,但是我的自定义类里有 构造函数的 SENSORS_ABILITY_FOR_TEST() { m_SpcData=NULL; LenOfSpcData=0; } //------------------------------ 现在问题就是 在构造函数里与析构函数里设断点,发现整段代码,构造函数执行了2次(sa,sb定义时),但析构函数却调用了5次之多。所以导致指针被多次delete 而致程序出错

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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