【问题标题】:Pointer and delete in C++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 来保存动态大小的内存。

标签: c++ winapi visual-c++


【解决方案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];

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多