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 这个可以帮你作清空操作
[解决办法]
运行快了,出什么问题
[解决办法]
++
[解决办法]
首先,在函数中,指针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);
}
}
[解决办法]
多线程咋办?