void Test(const wchar_t *test1) { wchar_t *newc = new wchar_t[wcslen(test1)]; wcsncpy_s(newc, wcslen(newc), test1, wcslen(test1)); //wcsncpy(newc, test1, wcslen(test1)); delete[] newc; }
在这个里面 当本人用wcsncpy的时候是可以正常delete[] newc的,但是本人用wcsncpy_s后执行delete[] newc就会提示 Heap block at xxx modified at xxx past requested size
有没有高手能解答一下两者的区别嘛。
解决方案
10
newc申请内存后并没有进行初始化,其实际数据是乱的,也是不可预计的。所以wcslen(newc)的结果可大可小,一般是一个很大的数字,所以用wcsncpy_s越界概率很大。另外,C风格字符串一定要考虑终止符,否则也很可能刚好越界。
正确写法:
size_t n = wcslen(test1)+1; // +1,包括终止符
wchar_t *newc = new wchar_t[n];
wcsncpy_s(newc, n,test1, n);
正确写法:
size_t n = wcslen(test1)+1; // +1,包括终止符
wchar_t *newc = new wchar_t[n];
wcsncpy_s(newc, n,test1, n);
10
忘了一点:申请字符内存后初始化常用的方法是:memset(newc,0,n * sizeof(wchar_t));
或拷贝完后强制一下末尾 newc[n-1] = 0;
或拷贝完后强制一下末尾 newc[n-1] = 0;