Оптимизация удаления переменной шаблона, тип которого определяет, какая перегруженная функция вызывается, что приводит кC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Оптимизация удаления переменной шаблона, тип которого определяет, какая перегруженная функция вызывается, что приводит к

Сообщение Anonymous »

У меня есть функция шаблона, которая может вызвать несколько версий перегруженной функции в зависимости от типа. Это выглядит примерно так: < /p>
template
void doSomething(T **inputT)
{
// do important things generalizable to types A and B
T *t = inputT[0];
doSomethingElse(t);
}

void doSomethingElse(A *input)
{
// do things specific to type A
free(input);
}

void doSomethingElse(B *input)
{
// do things specific to type B
free(input);
}

A **initializeSharedA()
{
A = malloc(sizeof(A*));
A[0] = malloc(sizeof(A));
}

static A **staticA = initializeSharedA();

int main()
{
doSomething(staticA);
}

< /code>
Игнорируйте тот факт, что вызовы «бесплатный (вход)» должны быть в Dosomphation или быть заменены на более C ++-решение стиля, двойное бесплатное, что это вызывает,-это то, что вызывает мою ошибку. /p>
Когда я составляю свой код в GCC с -O0, все работает нормально и, как и ожидалось. Однако перемещение даже к -og приводит к очень странному поведению. Я прошел через него в GDB, и происходило, так это то, что в рамках одной функции вызововать что -то (a), DosomethingElseelse (a*) и DosomethingElseElse (b*) оба были вызваны один за другим, что привело к двойной свободной ошибке в ошибке в Второй звонок. />#0 doSomethingElse at main.cpp:11
#1 in doSomething
#2 in main
< /code>
Затем, когда я перехожу к концу dosomethingetheneelse (a*), он немедленно входит в DosomethingElseElse (b*), и я получаю этот стек трассировку: < /p>
#0 doSomethingElse at main.cpp:17
#1 in ?? ()
#2 in doSomething
#3 in main
< /code>
Так что он до сих пор знает, что мы находимся в досоме , но потом есть загадочный »??» Кадр, который каким -то образом называет dosomethingelse (b*). < /p>
Я получаю окончательный подсказку при печати переменной t* t в Dosomething: < /p>
print t
$1 =
< /code>
Таким образом, мне кажется, что оптимизация удаляет переменную, чей тип определяет, какая функция Freemomehate Chhite вызывается, каким -то образом вызывает множество версий функции вызову вместо того, чтобы просто давать ошибку. Еще один интересный бит заключается в том, что при составлении с -og я не могу поместить точку останова на вызове DosomethingElse, так что я думаю, что это тоже стало вставлено. < /P>
Прямо сейчас я Работа по этому поводу, окружая что -то досовое и все версии dosomethingelse с: < /p>
#pragma GCC push_options
#pragma GCC optimize ("O0")
...
#pragma GCC pop_options
< /code>
Это работает и не слишком сильно замедляет программное обеспечение, но если мне придется отключить свой код, чтобы оно работало, что, вероятно, означает, что я просто придерживаюсь повязки на неопределенную поведение. Что я делаю неправильно, чтобы вызвать проблему в первую очередь?
Моя версия GCC - 11.5.0.

Подробнее здесь: https://stackoverflow.com/questions/794 ... overloaded
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»