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++中的指针和删除的主要内容,如果未能解决你的问题,请参考以下文章

当指向删除和指向不同的对象时,C++ 中的 Seg 错误指针

如何正确删除 C++ 中的指针? [复制]

c ++:原始指针映射中的复制,删除和运算符=

力扣:删除排序数组中的重复项(c++)

无法分配给 C++ 中的指针数组

(C++) list.error 方法和使用指针删除内存