memcpy和_CrtlsValidHeapPointer(pUserData)

时间:2013-12-07 07:43:13

标签: c++ string visual-studio char memcpy

我的for循环中的memcpy有问题 - 我需要将字符串转换为* char:

for(i=0;i<10000;i++){
    char* Bchar = new char[Bi[i].length()+1];
    ZeroMemory(Bchar,Bi[i].length());
    memcpy(Bchar, Bi[i].c_str(), Bi[i].length()); //Exception on this row
    ...
    delete [] Bchar; 
}

exception

的链接

2 个答案:

答案 0 :(得分:1)

看起来你不是将字符串零终止到新创建的Bchar缓冲区中。根据您在复制到Bchar缓冲区后对缓冲区执行的操作,您很可能会访问缓冲区的末尾。

而不是ZeroMemory / memcpy,只需使用strcpy(或strcpy_s)。

答案 1 :(得分:1)

此代码:

char* Bchar = new char[Bi[i].length()+1];
ZeroMemory(Bchar,Bi[i].length());

不会将最后一个字节归零。并且您不会在随后的memcpy中复制该字节。

而不是ZeroMemory只使用标准C ++,

char* Bchar = new char[ Bi[i].length()+1 ]();

然而,虽然这解决了问题,但为什么不使用std::vector并让 it 管理内存?

string const& s = Bi[i];
vector<char>  Bchar( s.begin(), s.end() );

作为一般规则,直接使用newdelete作为一种气味的气味。