Я возился с 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;
}
Меня смущает то, что я не изменяю ничего в указателе после того, как позвоню. Какие-нибудь идеи о том, что происходит?
Указатели не (обязательно) увеличиваются на n
байтов при добавлении n
к ним. Они увеличиваются на sizeof(*p) * n
байтов.
Таким образом, вы увеличиваете значение testStruct2
по testStruct2
sizeof(STestStruct) * sizeof(STestStruct)
, слишком много. Нужно только добавить 1
, т. STestStruct
к блоку для следующего объекта STestStruct
.
Вы хотите
STestStruct* testStruct2 = testStruct + 1;
поскольку указатели всегда увеличиваются в единицах размера их базового типа.