Существуют ли условия, при которых использование "__attribute __ ((warn_unused_result))" не будет работать? - PullRequest
6 голосов
/ 04 августа 2011

Я пытался найти причину, почему это не работает в моем коде - я думаю, что это должно работать.Вот выдержка из заголовочного файла:

#define WARN_UNUSED     __attribute__((warn_unused_result))

class Trans {

    Vector GetTranslation() const WARN_UNUSED {
        return t;
    }

};

Итак, мой вопрос: почему я не получаю предупреждение при компиляции кода с чем-то вроде:

Gt.GetTranslation();

?

Спасибо за помощь.

1 Ответ

2 голосов
/ 04 августа 2011

Назначение этого атрибута предназначено (но не исключительно) для указателей на динамически распределяемые данные.

Это дает гарантию времени компиляции, что вызывающий код будет хранить указатель впеременная (может быть как параметр функции тоже, но в этом я не уверен) en тем самым делегирует ответственность за освобождение \ освобождение \ удаление объекта, на который она указывает.

Это для предотвращения утечки памяти и \ или других аспектов управления временем жизни.

Например, если вы вызываете malloc (...) без сохранения указателя, вы не можете освободитьэто потом.(malloc должен иметь этот атрибут)

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

Кстати, это не особенно полезно для возвращаемых ссылок (если вы не знаете об этом код и требует какой-то release механизм), так как указанный объект не разрушается при выходе из области видимости.

...