读书人

memcpy失误

发布时间: 2013-08-09 15:16:24 作者: rapoo

memcpy出错


char* GBKToUtf8(const char* strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, (LPSTR)szUtf8, len, NULL,NULL);
return szUtf8;
}


memcpy(file.FileName,GBKToUtf8(file.FileName),sizeof(file.FileName));


这句出错,定位到汇编是
Dword_align:
test edi,11b ;U - destination dword aligned?
jnz short CopyLeadUp ;V - if we are not dword aligned already, align

shr ecx,2 ;U - shift down to dword count
and edx,11b ;V - trailing byte count

cmp ecx,8 ;U - test if small enough for unwind copy
jb short CopyUnwindUp ;V - if so, then jump

rep movsd ;N - move all of our dwords///这里运行不下去了,大概是什么问题?




平时不出问题,运行快了,就开始出问题。
------解决方案--------------------


有多快?这么不停的new,也不delete

判断下函数返回值吧
[解决办法]


不知道是不是这个原因!
当你循环调用这个接口的话,建议不要用memset,这个函数很消耗资源的!
建议用calloc 这个可以帮你作清空操作

[解决办法]
运行快了,出什么问题
[解决办法]
引用:
有多快?这么不停的new,也不delete

判断下函数返回值吧

++


[解决办法]
首先,在函数中,指针wszUtf8是new的,当函数返回前,没有及时delete
第二,在函数中为指针szUtf8申请了内存,然后返回,本来不算错误,只要在外面用完能释放。
但是 memcpy(file.FileName,GBKToUtf8(file.FileName),sizeof(file.FileName)); 这句运行完,还找得到szUtf8指向的内存吗?至少先用一个指针把函数返回的指针保存下,用完再delete吧。

就这2点,运行时间长了肯定出问题。
[解决办法]
改为
#define MAXLEN 8192
char* GBKToUtf8(const char* strGBK)
{
static unsigned short wszUtf8[MAXLEN+1];
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
if (len>=MAXLEN) len=MAXLEN;
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
static char szUtf8[MAXLEN/2*3+1];
if (len>=MAXLEN/2*3) len=MAXLEN/2*3;
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, (LPSTR)szUtf8, len, NULL,NULL);
return szUtf8;
}

[解决办法]
new开销大,还得记得别忘delete,麻烦。
//使用动态分配
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int i,L;
char *p;
void main() {
for (i=0;i<20000;i++) {
L=rand();
p=malloc(L);
if (NULL==p) {
printf("malloc error!\n");


continue;
}
memset(p,0,L);
free(p);
}
}
//不使用动态分配
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAXLEN 30000
int i,L;
char buf[MAXLEN];
char *p;
void main() {
p=&buf[0];
for (i=0;i<20000;i++) {
L=rand();
if (L>MAXLEN) {
printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);
L=MAXLEN;
}
memset(p,0,L);
}
}


[解决办法]
引用:
new开销大,还得记得别忘delete,麻烦。
//使用动态分配
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int i,L;
char *p;
void main() {
for (i=0;i<20000;i++) {
L=rand();
p=malloc(L);
if (NULL==p) {
printf("malloc error!\n");
continue;
}
memset(p,0,L);
free(p);
}
}
//不使用动态分配
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAXLEN 30000
int i,L;
char buf[MAXLEN];
char *p;
void main() {
p=&buf[0];
for (i=0;i<20000;i++) {
L=rand();
if (L>MAXLEN) {
printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);
L=MAXLEN;


}
memset(p,0,L);
}
}



多线程咋办?

读书人网 >C语言

热点推荐