C ++ Стандартно ли поведение деструкторов для временных аргументов функций?

У меня есть несколько специфический вопрос относительно деструкторов в C ++. Намного проще объяснить то, что я спрашиваю, с помощью кода. В основном я хочу сделать что-то похожее (но не совсем) на это:

foo( bar().ptr );

В этом примере указатель указывает на динамическую память в объекте, возвращаемом из ‘bar ()’. Мы можем предположить, что указатель является символом * из простоты. Я хочу быть уверен, что данные, на которые указывает ‘ptr’, живут во время выполнения ‘foo ()’. Теперь уточним, что я имею в виду в коде:

foo( char* ptr )
{
// do stuff with *ptr
}

obj bar()
{
obj thing;

return thing;
}

struct obj
{
char* ptr;

obj()
{
ptr = new char[1];
}

~obj()
{
delete[] ptr;
}
};

Теперь это работает в Visual Studio без полной оптимизации. Я параноик и хочу иметь 100% уверенность в этом, хотя. Этот код также должен работать в Linux (скомпилирован с gcc). Строго x86.

Это несколько неуловимо, поэтому я решил спросить, является ли это поведение стандартным. Казалось бы, компилятор хочу чтобы убедиться, что это работает.

Спасибо!

1

Решение

Да, у вас есть гарантия. Временные живут до конца выражения, которое до функции foo() возвращается в вашем случае.

Концептуально ваш случай ничем не отличается от

void x(const char* );

x(std::string("String").c_str());

И это проверенная временем практика!

Как примечание, ваш класс Smart-указателя написан крайне плохо, но я беру его только для иллюстрации, а не для реального кода.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]