C++中的指针和删除
Posted
技术标签:
【中文标题】C++中的指针和删除【英文标题】:Pointer and delete in C++ 【发布时间】:2013-12-17 07:33:40 【问题描述】:void *mm(void *pTo,void*pOr,size_t s)
assert((pTo)&&(pOr));
char* pt = (char*)pTo;
char* po = (char*)pOr;
while(s-->0)
*pt++ = *po++;
return pTo;
int _tmain(int argc, _TCHAR* argv[])
char *p1 = new char;
char *p2 = "permutation";
p1 = (char *)mm(p1,p2,4);
printf(p1);
//delete p1;
return 0;
以上是我的测试项目。如何删除新的字符内存? 我总是收到“HEAP CORRUPTION DETECTED 错误... CRT 检测到应用程序在堆缓冲区结束后写入内存”。 提前致谢。
【问题讨论】:
最好不要调用new或delete。使用 std::vector 来保存动态大小的内存。 【参考方案1】:你给 p1 1 个新字符
char *p1 = new char;
但你尝试写 4
while(s-->0)
*pt++ = *po++;
您正在写入不属于您的内存。
做:
char *p1 = new char[4];
然后删除:
delete[] p1;
【讨论】:
由于结果指针后来被解释为字符串(printf
),因此需要分配 5 个字符(零终止符多一个)或仅复制 3 个字符并使用第四个字符零终结者。在任何情况下,都需要零终止符。
那是delete[] p1
,而不是delete p1[]
。【参考方案2】:
您没有在 p1 的“末尾”分配足够的字节。具体来说,您只分配一个字节,但将 4 个字节复制到该位置。因此,您在分配的空间之外写入 3 个字节。
而是将 p1 分配为:
char *p1 = new char[4];
【讨论】:
以上是关于C++中的指针和删除的主要内容,如果未能解决你的问题,请参考以下文章