手动调用析构函数以获取静态分配的变量

时间:2018-12-26 22:05:34

标签: c++

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上手动调用析构函数?

1 个答案:

答案 0 :(得分:3)

  

是否可以在对象std :: string上手动调用析构函数?

从技术上讲,可以调用自动变量的析构函数。但是,如果执行使作用域具有一个已破坏的自动变量,则该程序的行为将是不确定的,因此在实践中几乎没有用。您不希望您的程序具有未定义的行为。

当您使用新放置的表达式为对象或对象数组重用存储(通常为charstd::byte的数组)时,通常使用对析构函数的显式调用。

  

如何做到这一点?

就像调用成员函数一样,调用析构函数。对于名为~T的类,析构函数的名称为T。对于命名空间中std::string和其他类型别名的特定情况,您需要做一些体操运动来绕开语法限制。以下所有内容均正确:

s.std::string::~string();

s.~basic_string();

using std::string;
s.~string();

P.S。 s具有自动存储功能,而不是静态存储。