C++ 意外函数结束时的清理,std等效

C++ 意外函数结束时的清理,std等效,c++,c++14,std,C++,C++14,Std,我有一些函数需要使用成员变量(自定义类的向量)。 在该功能结束时,需要清除该成员,但在该功能期间,该成员需要保持成员身份。 另一个问题是,由于程序的自定义错误处理,函数可能过早结束。然而,该成员国仍然需要获得批准 我首先使用std::move在局部变量中移动了这个成员。 这工作得很好,但是现在我需要变量作为成员变量一直保持到函数结束 我提出了以下解决方案,使用一个独特的_ptr和一个参考,将在销毁后移动 #include <iostream> #include <vector&

我有一些函数需要使用成员变量(自定义类的向量)。
在该功能结束时,需要清除该成员,但在该功能期间,该成员需要保持成员身份。 另一个问题是,由于程序的自定义错误处理,函数可能过早结束。然而,该成员国仍然需要获得批准

我首先使用std::move在局部变量中移动了这个成员。 这工作得很好,但是现在我需要变量作为成员变量一直保持到函数结束

我提出了以下解决方案,使用一个独特的_ptr和一个参考,将在销毁后移动

#include <iostream>
#include <vector>
#include <memory>
using namespace std;

template <class T>
class Clean
{
public:
    Clean(T& clean)
        : m_clean(clean) {}
    ~Clean()
    {
        T destroy = move(m_clean);
    }
private:
    T& m_clean;
};

class A
{
public:
    A()
    {
        m_numbers = { { 3, 1 ,4, 1, 5} };
    }

    void display()
    {
        auto cleanNumbers = make_unique<Clean<vector<int> > >(m_numbers);
        for(int number: m_numbers)
            cout << number << endl;
    }
private:
    vector<int> m_numbers;
};

int main()
{
    A a;
    a.display();
    cout << "should be empty now" << endl;
    a.display();
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
模板
班级清洁
{
公众:
清洁(T&Clean)
:m_clean(clean){}
~Clean()
{
T销毁=移动(m_清洁);
}
私人:
T&m_清洁;
};
甲级
{
公众:
()
{
m_数={3,1,4,1,5};
}
无效显示()
{
自动清洗编号=使_唯一(m_编号);
用于(整数:m_数)

cout您可以使用共享\u ptr的自定义删除器来获得相同的结果

void A::display()
{
    std::shared_ptr<int> dummy (
        (int*)alloca(sizeof(int)),                 // very fast allocate on stack
        [&](int*) { this->m_numbers.clear(); }
    );

    for(int number: m_numbers)
        cout << number << endl;
}
void A::display()
{
std::共享的ptr虚拟(
(int*)alloca(sizeof(int)),//堆栈上的快速分配
[&](int*){this->m_numbers.clear();}
);
用于(整数:m_数)

cout这是我通过评论和其他问题得出的结果:

void display()
{
    auto cleanNumber = [](decltype(m_numbers)* numbers){ 
        if(numbers) 
            numbers->clear();
    };
    auto pClean = std::unique_ptr<decltype(m_numbers), decltype(cleanNumber)>(&m_numbers, cleanNumber);
    for(int number: m_numbers)
        cout << number << endl;
}
void display()
{
自动清洗编号=[](decltype(m_编号)*编号){
如果(数字)
数字->清除();
};
自动清洁=标准::唯一清洁编号(&m\U编号,清洁编号);
用于(整数:m_数)

我还知道,只有在为某个类实现移动构造函数时,这才有效,但在我的情况下,这是可以的。可以构造唯一的指针,将自定义删除器作为无状态lambda或用于资源销毁的函数来调用。@Ron我知道,这正是我在代码中为Clean提供正确行为所做的。我的问题是N是如果有一个STD等价的这个干净类。你如何使用lambda来实现这个?Scott Meyers有效的现代C++项目18也被提及。我将使用<代码> SyddypTr>代码>而不是使用不可移植的<代码> AlOLCA</代码>。这不是用G++5.3.0:G++STD= C++ 17 -O主ME。你要为从堆中分配付出代价。alloca肯定比使用nullptr更具可移植性,并祈祷你的编译器不会初始化
dummy
。gcc、MSVC和clang确实支持alloca。@MichaëlRoy感谢你的努力,但我似乎无法在g++中使用它。我得到以下错误:>g++-Wall-Wpedantic-march=native-std=c++14-o main3 main3.cpp main3.cpp:在成员函数“void A::display()”:main3.cpp:17:37:错误:未在此作用域(int*)alloca(sizeof(int))中声明“alloca”我不会对你投赞成票,但是我需要一个更通用的解决方案,因为它只是示例代码,在实际的实现中,它需要在VisualC++和CLAN中编译。
void display()
{
    auto cleanNumber = [](decltype(m_numbers)* numbers){ 
        if(numbers) 
            numbers->clear();
    };
    auto pClean = std::unique_ptr<decltype(m_numbers), decltype(cleanNumber)>(&m_numbers, cleanNumber);
    for(int number: m_numbers)
        cout << number << endl;
}