适当的析构函数/ RAII/Something

Jag*_*oly 0 c++

这是我遇到的一个问题的最小例子,我无法弄清楚我应该如何解决它:

#include <vector>
#include <memory>

class Thing {
};

class App {
public:
    std::vector<std::unique_ptr<Thing>> thingVec;
    void add_thing(Thing*);
};

void App::add_thing(Thing* thing) {
    thingVec.push_back(std::unique_ptr<Thing>(thing));
}

int main() {
    App app;

    Thing thing;

    app.add_thing(&thing);
}
Run Code Online (Sandbox Code Playgroud)

这个编译并运行没有任何问题,但是,当到达主要,段错误和吐出的结尾时:

Error in `/path/testapp': free(): invalid pointer: 0x00007fff97118070 ***
Run Code Online (Sandbox Code Playgroud)

任何可能的帮助?我想存储(唯一)指针的原因是Thing通常会派生出来.

编辑:一个有效的解决方案:

#include <vector>
#include <memory>

class Thing {
};

class App {
public:
    std::vector<std::unique_ptr<Thing>> thingVec;
    void add_thing(Thing*);
};

void App::add_thing(Thing* thing) {
    thingVec.push_back(std::unique_ptr<Thing>(thing));
}

int main() {
    App app;

    Thing* thing = new Thing;
    app.add_thing(thing);
}
Run Code Online (Sandbox Code Playgroud)

但根据我的理解,我应该能够完全避免使用new,并使用make_unique?我似乎无法找到make_unique实际定义的位置.

编辑2:

这更合适吗?有没有一个不那么混乱的方式来做到这一点?否则,它运作良好.

#include <vector>
#include <memory>
#include <iostream>

class Thing {
public:
    int foo = 42;
};

class App {
public:
    std::vector<std::unique_ptr<Thing>> thingVec;
    void add_thing(std::unique_ptr<Thing>);
};

void App::add_thing(std::unique_ptr<Thing> thing) {
    thingVec.push_back(std::move(thing));
}

int main() {
    App app;
    app.add_thing(std::unique_ptr<Thing>(new Thing()));

    std::cout << app.thingVec.back()->foo << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

因为我最终可能会像

app.thingVex.back()->barVec.back()->blahMap.emplace("flop", std::unique_ptr<Tree>(new Tree));
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 6

std::unique_ptr正在尝试删除堆栈分配的Thing实例.

你的错误主要在于:

 Thing thing;
 app.add_thing(&thing);
Run Code Online (Sandbox Code Playgroud)