我对C ++中的析构函数有一些特定的问题。解释我通过代码询问的内容要容易得多。基本上我想做类似的事情(但不完全是):
foo( bar().ptr );
在此示例中,指针指向从' bar()'返回的对象内的动态内存。我们可以假设指针是简单的char *。我想确保那些“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。
这有点微妙,所以我想我会问这个行为是否标准。看起来编译器会想要来确保这种方法有效。
谢谢!
答案 0 :(得分:4)
是的,您有保证。临时工作一直持续到表达式结束,直到函数foo()
返回为止。
从概念上讲,您的案例与
没有什么不同void x(const char* );
x(std::string("String").c_str());
这是历史悠久的做法!
作为旁注,你的智能指针类写的非常糟糕,但我认为它只是为了说明而不是真正的代码。