我尽我所能做了SSCE。我的怀疑是,在我主要询问它们之前,共享指针解构(释放)我的对象。如何在不完全绕过共享指针的情况下防止这种情况发生?这是一个程序中的孤立问题,否则通过使用shared_ptrs会有很大帮助。
Test.h:
#ifndef TEST_H
#define TEST_H
#include <memory>
#include <iostream>
#include <vector>
class Test
{
public:
Test();
virtual ~Test();
static std::shared_ptr<Test> makeTestFrom(std::string l);
std::vector<std::shared_ptr<int>> reg_vec;
protected:
private:
};
#endif // TEST_H
Test.cpp的
#include <memory>
#include <iostream>
#include <vector>
Test::Test():
reg_vec()
{
//ctor
}
Test::~Test()
{
//dtor
}
std::shared_ptr<Test> Test::makeTestFrom(std::string l)
{
std::shared_ptr<Test> sp(new Test());
std::shared_ptr<int> i(new int(3));
sp->reg_vec.push_back(i);
return sp;
}
main.cpp中:
#include <memory>
#include <iostream>
#include <vector>
#include "include/Test.h"
using namespace std;
int main()
{
std::unique_ptr<Test> x(new Test());
x->makeTestFrom("loldoesntmatter");
std::cout << x->reg_vec[0] << std::endl;
return 0;
}
答案 0 :(得分:4)
int main() {
std::unique_ptr<Test> x(new Test());
x->makeTestFrom("loldoesntmatter"); // you discarded the return
std::cout << x->reg_vec[0] << std::endl; // x->reg_vec is empty
return 0;
}
此外,共享指针太多
答案 1 :(得分:3)
你制作了太多新物品。在main
,您在int
内寻找x->reg_vec
,但makeTestFrom
未向x
添加任何内容,它会创建一个全新的对象并将整数放在其中。
除此之外,你还在滥用shared_ptr
。在C ++中,尽可能避免动态分配。 int
传递的价格比使用shared_ptr
便宜,所以只需使用vector<int>
。并且Test
对象也可以使用自动生命周期创建。
仅仅因为其他一些语言(即Java)使得一切都处理起来并不意味着它是C ++的一个好模式。