HeapFree Сработала точка останова

0

Я возился с malloc и свободен, и у меня была проблема, когда, когда я звоню в бесплатную визуальную студию, говорит, что моя программа вызвала точку останова. Это ошибка, которую я получаю:

HEAP: свободный кусок блока 5371d0, измененный на 537230 после его освобождения

Вот код, который у меня есть:

#include <malloc.h>


struct STestStruct
{
    STestStruct(int _a, int _b, int _c)
    : a(_a), b(_b), c(_c)
    {
    }

    int a;
    int b;
    int c;
};

int main(int argc, char** argv)
{
    void* myMem = malloc(sizeof(STestStruct) * 2);
    STestStruct* testStruct = (STestStruct*)myMem;
    (*testStruct) = STestStruct(1, 2, 3);

    // If I comment this and the next line out, everything is fine
    STestStruct* testStruct2 = testStruct + sizeof(STestStruct); 
    (*testStruct2) = STestStruct(1, 2, 3);


    free(myMem);

    return 0;
}

Меня смущает то, что я не изменяю ничего в указателе после того, как позвоню. Какие-нибудь идеи о том, что происходит?

  • 2
    Посмотрите еще раз, что оператор + делает для указателей.
  • 0
    Вид связанных. Я думаю, что это работает точно так же в C ++, и вы можете найти похожий отрывок в стандарте. stackoverflow.com/questions/24116884/...
Показать ещё 1 комментарий
Теги:
free

2 ответа

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

Указатели не (обязательно) увеличиваются на n байтов при добавлении n к ним. Они увеличиваются на sizeof(*p) * n байтов.

Таким образом, вы увеличиваете значение testStruct2 по testStruct2 sizeof(STestStruct) * sizeof(STestStruct), слишком много. Нужно только добавить 1, т. STestStruct к блоку для следующего объекта STestStruct.

  • 0
    Спасибо! Я не осознавал, что совершил такую глупую ошибку.
1

Вы хотите

STestStruct* testStruct2 = testStruct + 1; 

поскольку указатели всегда увеличиваются в единицах размера их базового типа.

Ещё вопросы

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