Безопасно ли возвращать структуру в C или C ++? - PullRequest
77 голосов
/ 06 марта 2012

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

typedef struct{
    int a,b;
}mystruct;

А потом вот функция

mystruct func(int c, int d){
    mystruct retval;
    retval.a = c;
    retval.b = d;
    return retval;
}

Я понял, что мы всегда должны возвращать указатель на структуру malloc, если мы хотим сделать что-то подобное, но я уверен, что видел примеры, которыесделать что-то подобноеЭто правильно?Лично я всегда либо возвращаю указатель на структуру malloc, либо просто передаю ссылку на функцию и изменяю там значения.(Поскольку я понимаю, что, как только область действия функции закончится, любой стек, использованный для размещения структуры, может быть перезаписан).

Давайте добавим вторую часть к вопросу: зависит ли это от компилятора?Если да, то каково поведение последних версий компиляторов для рабочих столов: gcc, g ++ и Visual Studio?

Мысли по этому поводу?

Ответы [ 11 ]

2 голосов
/ 10 августа 2013

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

У меня был более сложный ответ, но модератору это не понравилось. Итак, за ваш счет мой совет короткий.

...