奇怪哦,memcpy后,程序关闭出错

fjlangzi 2009-10-19 05:19:16
SnmpParam spTmp;
m_map.Lookup(ip,spTmp);
m_pUpForm->m_snmpParam.ip = ip;
m_pUpForm->m_snmpParam.port = spTmp.port;
m_pUpForm->m_snmpParam.timeout = spTmp.timeout;
m_pUpForm->m_snmpParam.communityRead = spTmp.communityRead;
m_pUpForm->m_snmpParam.communityWrite = spTmp.communityWrite;
m_pUpForm->m_snmpParam.communityTrap = spTmp.communityTrap;
m_pUpForm->m_snmpParam.errorCount = spTmp.errorCount;
m_pUpForm->m_snmpParam.status = spTmp.status;
//使用上面这些,程序良好,而用下面一句话,程序关闭就出错了。

//memcpy(&(m_pUpForm->m_snmpParam),&spTmpp,sizeof(spTmpp));//使用这句话后,程序关闭就出错。


这是为什么??
...全文
177 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐鹦鹉 2009-10-20
  • 打赏
  • 举报
回复
这种方法很保险。
fjlangzi 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 happyparrot 的回复:]
举例:
typedef struct _SNMP_PARAM
{
    int n;
    CString sVal;
    void operator = (const _SNMP_PARAM &snmpParam)
    {
        n = snmpParam.n;
        sVal = snmpParam.sVal;
    }
}SNMP_PARAM;

最后,只要spTmpp = m_pUpForm->m_snmpParam;就行了。
[/Quote]

谢谢哦,搞定了。
tanwei1002 2009-10-19
  • 打赏
  • 举报
回复
把CString 改成char数组
快乐鹦鹉 2009-10-19
  • 打赏
  • 举报
回复
举例:
typedef struct _SNMP_PARAM
{
int n;
CString sVal;
void operator = (const _SNMP_PARAM &snmpParam)
{
n = snmpParam.n;
sVal = snmpParam.sVal;
}
}SNMP_PARAM;

最后,只要spTmpp = m_pUpForm->m_snmpParam;就行了。
fjlangzi 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 arong1234 的回复:]
你应该使用operator=重载,memcpy只适用于没有指针成员的结构,一般的类都严禁使用memcpy
引用 10 楼 fjlangzi 的回复:
引用 9 楼 luver 的回复:
引用 4 楼 danxuezx 的回复:
看您的代码应该如下吧:
memcpy(&spTmpp,&(m_pUpForm->m_snmpParam),sizeof(m_pUpForm->m_snmpParam));
另外,MSDN中的话:
1 memcpy copies count bytes from src to dest;
2 Make sure that the destination buffer is the same size or larger than the source buffer.


转了一圈,就这么多人回了啊,哈

问题就出现在CString成员上,memcpy后,两个CString对象地址相同,最后会导致析构两次


高手哦,可有解决方案?

[/Quote]

非常感谢哦。我试试。
fjlangzi 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 luver 的回复:]
贴一下SnmpParam 这个结构看看

如果里面有指针成员的话,memcpy()很容易出问题,因为memcpy()会直接改变指针的地址值
[/Quote]

memcpy 没问题,是用了memcpy后关闭程序的时候有问题。结构中有 CString 成员。
arong1234 2009-10-19
  • 打赏
  • 举报
回复
你应该使用operator=重载,memcpy只适用于没有指针成员的结构,一般的类都严禁使用memcpy
[Quote=引用 10 楼 fjlangzi 的回复:]
引用 9 楼 luver 的回复:
引用 4 楼 danxuezx 的回复:
看您的代码应该如下吧:
memcpy(&spTmpp,&(m_pUpForm->m_snmpParam),sizeof(m_pUpForm->m_snmpParam));
另外,MSDN中的话:
1 memcpy copies count bytes from src to dest;
2 Make sure that the destination buffer is the same size or larger than the source buffer.


转了一圈,就这么多人回了啊,哈

问题就出现在CString成员上,memcpy后,两个CString对象地址相同,最后会导致析构两次


高手哦,可有解决方案?
[/Quote]
快乐鹦鹉 2009-10-19
  • 打赏
  • 举报
回复
在结构中重载一个=操作符,来完成两个结构的拷贝。专业术语叫做深拷贝。这个很简单,也很实用。
fjlangzi 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luver 的回复:]
引用 4 楼 danxuezx 的回复:
看您的代码应该如下吧:
memcpy(&spTmpp,&(m_pUpForm->m_snmpParam),sizeof(m_pUpForm->m_snmpParam));
另外,MSDN中的话:
1 memcpy copies count bytes from src to dest;
2 Make sure that the destination buffer is the same size or larger than the source buffer.



转了一圈,就这么多人回了啊,哈

问题就出现在CString成员上,memcpy后,两个CString对象地址相同,最后会导致析构两次
[/Quote]

高手哦,可有解决方案?
烂番 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 danxuezx 的回复:]
看您的代码应该如下吧:
memcpy(&spTmpp,&(m_pUpForm->m_snmpParam),sizeof(m_pUpForm->m_snmpParam));
另外,MSDN中的话:
1 memcpy copies count bytes from src to dest;
2 Make sure that the destination buffer is the same size or larger than the source buffer.

[/Quote]

转了一圈,就这么多人回了啊,哈

问题就出现在CString成员上,memcpy后,两个CString对象地址相同,最后会导致析构两次
烂番 2009-10-19
  • 打赏
  • 举报
回复
贴一下SnmpParam 这个结构看看

如果里面有指针成员的话,memcpy()很容易出问题,因为memcpy()会直接改变指针的地址值
快乐鹦鹉 2009-10-19
  • 打赏
  • 举报
回复
出错的可能是字符串越界等问题。最好是这个结构中重载一个=操作符,来完成两个结构的拷贝。
fjlangzi 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 danxuezx 的回复:]
看您的代码应该如下吧:
memcpy(&spTmpp,&(m_pUpForm->m_snmpParam),sizeof(m_pUpForm->m_snmpParam));
另外,MSDN中的话:
1 memcpy copies count bytes from src to dest;
2 Make sure that the destination buffer is the same size or larger than the source buffer.

[/Quote]
&(m_pUpForm->m_snmpParam,才是我的目标地址。
这两个大小都是一样的,是同一个结构体定义的变量。
fjlangzi 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happyparrot 的回复:]
spTmpp是什么玩意?用sizeof是否能够正确得到你这个结构的长度呢?这个结构中有没有不是基础类型的变量?比如CString之类的。
[/Quote]
有啊 CString
sizeof应该没问题的,我调试的时候,看到每个成员都赋值正确。
danxuezx 2009-10-19
  • 打赏
  • 举报
回复
看您的代码应该如下吧:
memcpy(&spTmpp,&(m_pUpForm->m_snmpParam),sizeof(m_pUpForm->m_snmpParam));
另外,MSDN中的话:
1 memcpy copies count bytes from src to dest;
2 Make sure that the destination buffer is the same size or larger than the source buffer.
danxuezx 2009-10-19
  • 打赏
  • 举报
回复
您参数反了吧?
void *memcpy(
void *dest,
const void *src,
size_t count
);

dest
New buffer.

src
Buffer to copy from.

count
Number of characters to copy.
fandh 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happyparrot 的回复:]
spTmpp是什么玩意?用sizeof是否能够正确得到你这个结构的长度呢?这个结构中有没有不是基础类型的变量?比如CString之类的。
[/Quote]
怀疑你长度取的不对!
快乐鹦鹉 2009-10-19
  • 打赏
  • 举报
回复
spTmpp是什么玩意?用sizeof是否能够正确得到你这个结构的长度呢?这个结构中有没有不是基础类型的变量?比如CString之类的。

16,551

社区成员

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

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

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