Получение случайных сигналов SIGTRAP (в MinGW-gdb) является знаком повреждения памяти?

Я записал моей собственной ссылке считаемый C++ диспетчера памяти (для забавы), и я уверен, что это не прекрасно ;). И теперь когда я пытаюсь использовать его, я получил случайные сигналы SIGTRAP. Если я комментирую каждую строку, которые являются в связи с тем диспетчером памяти, все хорошо работает. Получение SIGTRAP-s вместо SIGSEGV является довольно странным. Я знаю, что SIGTRAP-s брошены, когда программа поражает точку останова, но никакая точка останова не установлена. Я читал в другом потоке, которые отлаживают сборки exe's, и dll's должен быть актуальным. Они актуальны и таким образом, это не причина.

Кто-либо знает, почему это происходит?

6
задан Calmarius 24 February 2010 в 13:40
поделиться

2 ответа

После поиска в Google я понял, что эти сигтрапы такие же, как и предупреждения, которые вы получаете в MSVC ++: «Windows вызвала точку останова в xxxx.exe. Это может быть связано с повреждением. кучи, и указывает на ошибку blahblahblah "...

Кажется, да, неожиданные сигтрапы могут указывать на повреждение памяти (довольно странно ...)

И я тоже обнаружил свою ошибку. MM находится в статической библиотеке, которая связана с dll. И эта статическая библиотека и dll связаны с моим exe. Итак, было два менеджера памяти, один в моем exe и один в моей dll. Если вызвать метод инициализации MM. Он инициализировал MM в моем exe, но не в dll, поэтому dll прошла без init. Я решил это, не связав свой exe с этой статической библиотекой.

5
ответ дан 17 December 2019 в 00:08
поделиться

Я использую cancelBubble = true и stopPropagation () в обработчиках перемещения.

-121--831â-

Возможно, лучшим решением будет добавление дополнительного столбца, который автоматически набор для 1 в каждой строке. Как только имеется элемент, не имеющий значения NULL, измените его на 0.

Затем

If(drEntitity.rows[i].coulmn[8] = 1)
{
   dtEntity.Rows.Add(drEntity);
}
 else
 {
   //don't add, will create a new one (drEntity = dtEntity.NewRow();)
 }
-121--239073-

Я бы предположил, что вы, возможно, называете несовпадающие новые/удаленные или malloc/свободные реализации - Так что-то было выделено вашим менеджером памяти, но когда память освобождена, вы заканчиваете со стандартной реализацией delete/free.

Установите точку останова в сигнале и проверьте, есть ли в стеке свободное удаление () или удаление оператора и является ли это реализацией указанной функции, которую вы ожидаете.

2
ответ дан 17 December 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: