У меня есть несколько специфический вопрос относительно деструкторов в 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.
Это несколько неуловимо, поэтому я решил спросить, является ли это поведение стандартным. Казалось бы, компилятор хочу чтобы убедиться, что это работает.
Спасибо!
Да, у вас есть гарантия. Временные живут до конца выражения, которое до функции foo()
возвращается в вашем случае.
Концептуально ваш случай ничем не отличается от
void x(const char* );
x(std::string("String").c_str());
И это проверенная временем практика!
Как примечание, ваш класс Smart-указателя написан крайне плохо, но я беру его только для иллюстрации, а не для реального кода.
Других решений пока нет …