void func( int x )
{
char* pleak = new char[1024]; // might be lost => memory leak
std::string s( "hello world" ); // will be properly destructed
if ( x ) throw std::runtime_error( "boom" );
delete [] pleak; // will only get here if x == 0. if x!=0, throw exception
}
对于上面的代码,s在函数作用域的末尾销毁。 是否可以在对象std :: string上手动调用析构函数?
答案 0 :(得分:3)
是否可以在对象std :: string上手动调用析构函数?
从技术上讲,可以调用自动变量的析构函数。但是,如果执行使作用域具有一个已破坏的自动变量,则该程序的行为将是不确定的,因此在实践中几乎没有用。您不希望您的程序具有未定义的行为。
当您使用新放置的表达式为对象或对象数组重用存储(通常为char
或std::byte
的数组)时,通常使用对析构函数的显式调用。
如何做到这一点?
就像调用成员函数一样,调用析构函数。对于名为~T
的类,析构函数的名称为T
。对于命名空间中std::string
和其他类型别名的特定情况,您需要做一些体操运动来绕开语法限制。以下所有内容均正确:
s.std::string::~string();
s.~basic_string();
using std::string;
s.~string();
P.S。 s
具有自动存储功能,而不是静态存储。