C++ 字符数组的动态内存分配

C++ 字符数组的动态内存分配,c++,dynamic-memory-allocation,C++,Dynamic Memory Allocation,好的,我试着调整数组的大小,如下所示: if((editBufferCounter + 20) > editBufferSize) { char* temp; temp = new char[editBufferSize + 5]; strcpy(temp, editBuffer); delete[] editBuffer; editBufferSize *= 2; editBuffer = new char[editBuffer

好的,我试着调整数组的大小,如下所示:

if((editBufferCounter + 20) > editBufferSize)
{
    char* temp;
    temp = new char[editBufferSize + 5];

    strcpy(temp, editBuffer);

    delete[] editBuffer;

    editBufferSize *= 2;  

    editBuffer = new char[editBufferSize];

    strcpy(editBuffer, temp);

    delete[] temp;

}
最后一行
delete[]temp
导致内存问题。程序只是崩溃了。我似乎不明白这里的问题是什么

注:
如果我删除行
delete[]temp,程序运行正常

您的editBuffer是否具有终止NUL字符?如果没有,请将strcpy替换为strncpy

您的功能可以简化为:

if ((editBufferCounter + 20) > editBufferSize)
{
    char* temp = new char[editBufferSize * 2];

    std::copy_n(editBuffer, editBufferSize, temp);

    delete[] editBuffer;

    editBufferSize *= 2;  

    editBuffer = temp;
}

有什么原因让你乱用char*而不是std::string吗?如何获得editBufferSize的值?您可能正在处理堆损坏(strcpy?)为什么要使用双拷贝?只需分配两倍的大小,复制、释放并设置指向新内存的指针。您没有向我们展示的某些内容会导致您的程序崩溃。即使在接受答案建议的修复之后,您的代码也不安全。如果对
new
的任何一个调用抛出,会发生什么情况?我刚刚用
memcpy
尝试了一下,结果成功了。
strncpy
memcpy
有什么优势吗?strncpy复制的字符不超过n个,memcpy只复制n个字节。是的,我知道。由于
char
的大小是一个字节,所以还有其他区别吗?当处理未定义长度的c字符串时,每次处理c字符串时,必须使用
memcpy
调整长度。当处理字符数组时,
memcpy
可能会复制一些无用的字节,但
strncpy
不会。这意味着
strncpy
memcpy
更灵活,比
strcpy
更安全@arnkore:
strncpy
必须检查空字符并对目标进行零填充,因此它的工作与
memcpy
一样多。对于复制内存块,如devjeetroy的缓冲区,
memcpy
通常会更快。