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
通常会更快。