Munmap chunk invalid pointer

Munmap chunk invalid pointer

Кажется, моя программа падает с munmap_chunk(): invalid pointer ошибка. Это означает, что где-то должно быть недопустимое уничтожение, недопустимое использование бесплатного или что-то в этом роде. Но я не могу понять, где и почему. Упрощенный код, который все еще выдает эту ошибку, следующий (не беспокойтесь обо всех шаблонах и прочем, это имеет смысл в контексте моей программы, и без них я не смог бы воспроизвести эту ошибку. Я просто интересно почему это не получается)

Это дает следующий вывод на терминал:

Проведя некоторую отладку, я обнаружил, что ошибка должна произойти в конце функции std::string setValue(Input , typename Input ::type) , Однако в этой функции нет ничего освобожденного или разрушенного. Он просто выделяет пространство и копирует содержимое c-строки newValue (который имеет тип std :: string) к данным. данные не уничтожаются в конце функции, потому что это указатель, верно? Я также пытался посмотреть адреса переменных dbObj , str и содержание указателя data , Однако ни один из них не равен одному в сообщениях об ошибках ( 0x00007ffd229f8490 ).
Где и почему возникает эта ошибка?

Решение

Двухпараметрическая setValue проявляет неопределенное поведение, выходя из функции, не встречая return заявление. Он должен возвращать значение, но никогда не возвращает.

Я пишу визуализатор, используя низкоуровневые функции SDL, чтобы узнать, как все это работает. Теперь я пытаюсь сделать рисование многоугольника, но я столкнулся с ошибками, возможно, из-за моей неопытности с C++. При запуске кода я получаю munmap_chunk() — Invalid pointer ошибку munmap_chunk() — Invalid pointer . Поиск показывает, что, скорее всего, из-за свободной() -ing памяти дважды. Ошибка при возврате из функции. Я понимаю, что ошибка исходит из автоматически free() памяти, которая была автоматически free() d раньше, но я недостаточно опытен, чтобы C++ обнаружил ошибку. Любые подсказки?

Читайте также:  Right alt на клавиатуре

Использование valgrind дает мне этот результат (это первая ошибка, которую он сообщает). Как ни странно, программа восстанавливается и продолжает работать с ожидаемым результатом, видимо, не получая такую же ошибку:

Я думаю, что мой предыдущий пост по подобной теме был бы полезен.

Из вашего отчета Valgrind, похоже, что ваша программа повреждает память из-за переполнения. Это не похоже на ошибку "double free" (это сценарий переполнения). Вы упомянули, что когда-то valgrind не сообщает о какой-либо ошибке, это затрудняет эту проблему. Однако, конечно, есть повреждение памяти, и вы должны их исправить. Ошибка памяти иногда возникает прерывистой из-за различной причины (разные параметры ввода, многопоточность, изменение последовательности выполнения).

I’ve spotted the error in my program and decided to write a simple one, which would help me understand what’s going on. Here it is :

The first() function is working properly, but the second() (exactly the free(out) ) genarates error:

Error in `./a.out’: munmap_chunk(): invalid pointer: 0x0000000000400714 *** ababAborted (core dumped)

I don’t understand why the first function is correct, but the second isn’t. Could anyone explain why?

2 Answers 2

In the function second() , the assignment word = "ab"; assigns a new pointer to word , overwriting the pointer obtained through malloc() . When you call free() on the pointer later on, the program crashes because you pass a pointer to free() that has not been obtained through malloc() .

Assigning string literals does not have the effect of copying their content as you might have thought. To copy the content of a string literal, use strcpy() :

In function char * second

The second statement word = "ab"; changes word to point away from the allocated memory.You are not copying the string "ab" to the area of heap allocated by malloc .

Читайте также:  Брусбокс и рехау сравнить

And to free a memory that is not allocated by malloc or similar functions crashes your program.

Attempting to free an invalid pointer (a pointer to a memory block that was not allocated by calloc, malloc, or realloc) may affect subsequent allocation requests and cause errors.

You should use here strcpy as also suggested by others.

Ссылка на основную публикацию
Adblock detector