У меня есть фрагмент шаблонного кода, который никогда не запускается, но компилируется. Когда я его удаляю, другая часть моей программы ломается.
Во-первых, я немного растерялся относительно того, как задать этот вопрос. Поэтому я попытаюсь дать много информации о проблеме.
Итак, я решил полностью перепроектировать мой тестовый проект для своей экспериментальной библиотеки ядра. Я использую много шаблонных махинаций в библиотеке. Когда я удалил «пользовательский» код, тесты дали мне ошибку выделения памяти. После долгих экспериментов я сузил его до следующего кода (из пары сотен строк):
void VOODOO(components::switchBoard &board) {
board.addComponent<using_allegro::keyInputs<'w'> >();
}
Фундаментально, что меня удивляет, так это то, что кажется, что компиляция этой функции (и функции шаблона, которую она затем использует, и функций шаблона, которые затем используют ...), делает эту ошибку не появляются Этот код не запускается . Подобный код (тот же, но для разных значений ключа) встречается в другом месте, но находится внутри кода Boost TDD.
Я понимаю, что, конечно, я не дал достаточно информации, чтобы вы могли решить ее для меня; Я пытался, но это более или менее вписывается в большую часть кода. Я думаю, что больше всего ищу «вот в чем проблема», «здесь, где искать» и т. Д. Во время компиляции происходит что-то из-за этой строки, но я недостаточно знаю об этом шаге, чтобы начать искать .
О-о-о-о, как (предположительно) скомпилированный, но фактически никогда не запущенный бит шаблонного кода, после удаления вызвать сбой другой части кода?
Ошибка:
Unhandled exceptionat 0x6fe731ea (msvcr90d.dll) in Switchboard.exe:
0xC0000005: Access violation reading location 0xcdcdcdc1.
CallStack:
operator delete(void * pUser Data)
allocator< class name related to key inputs callbacks >::deallocate
vector< same class >::_Insert_n(...)
vector< " " >::insert(...)
vector<" ">::push_back(...)
Похоже, что вектор неверен, потому что _MyFirst
и подобные члены данных показывают значения 0xcdcdcdcd
в отладчике. Но вектор является переменной-членом ...
Обновление: вектор недействителен, потому что он никогда не был создан. Я получаю Stomp значения идентификатора канала, что заставляет меня рассматривать один тип канала как другой.
Обновление:
Повторный поиск с помощью отладчика, похоже, что мой метод присвоения каждому «каналу» собственного уникального идентификатора не дает мне уникальный идентификатор:
inline static const char channel<template args>::idFunction() {
return reinterpret_cast<char>(&channel<CHANNEL_IDENTIFY>::idFunction);
};
Обновление 2: эти два дают одно и то же:
slaveChannel<switchboard, ALLEGRO_BITMAP*, entityInfo<ALLEGRO_BITMAP*>
slaveChannel<key<c>, char, push<char>
Оооо, имеет смысл менять другой скомпилированный тип канала, потому что он сдвигается вокруг значений idFunctions? Но почему существуют две idFunctions с одинаковым значением?