Указатель и удаление в C ++

0
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 error... CRT обнаружил, что приложение записано в память после окончания кучного буфера". Заранее спасибо.

  • 0
    Лучше даже не называть новые или удалять. Используйте std :: vector для хранения памяти динамического размера.
Теги:
visual-c++
winapi

2 ответа

3
Лучший ответ

Вы даете p1 1 новый символ

char *p1 = new char;

но вы пытаетесь написать 4

while(s-->0)
        *pt++ = *po++;

Вы пишете в память, которой у вас нет.

Делать:

char *p1 = new char[4];

Затем удалите:

delete[] p1;

  • 0
    большое спасибо.
  • 0
    Поскольку результирующий указатель позже интерпретируется как строка (с помощью printf ), необходимо либо выделить 5 символов (еще один для нулевого терминатора), либо скопировать только 3 символа и использовать четвертый для нулевого терминатора. В любом случае, нулевой терминатор не требуется.
Показать ещё 1 комментарий
0

вы не выделяете достаточное количество байтов "в конце" p1. В частности, вы выделяете только один байт, но копируете 4 байта в местоположение. Следовательно, вы пишете 3 байта за выделенное пространство.

Вместо этого выделите p1 как:

char *p1 = new char[4];

Ещё вопросы

Сообщество Overcoder
Наверх
Меню