这是我遇到的一个问题的最小例子,我无法弄清楚我应该如何解决它:
#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)
std::unique_ptr正在尝试删除堆栈分配的Thing实例.
你的错误主要在于:
Thing thing;
app.add_thing(&thing);
Run Code Online (Sandbox Code Playgroud)