1

我已尽我所能制作了 SSCE。我的怀疑是共享指针在我在 main 中请求它们之前解构(释放)我的对象。如何在不完全规避共享指针的情况下防止这种情况发生?这是一个程序中的孤立问题,否则使用 shared_ptrs 会大大帮助。

测试.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

测试.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;
}

主.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;

}
4

2 回答 2

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;

}

此外,太多的共享指针

于 2012-09-27T02:26:35.937 回答
3

您正在制作太多新对象。在main中,您正在寻找一个intinside x->reg_vec,但makeTestFrom没​​有向 中添加任何内容x,它创建了一个全新的对象并将整数放入其中。

除此之外,你还在滥用shared_ptr. 在 C++ 中,尽可能避免动态分配。 int通过价值传递比 with 更便宜shared_ptr,所以只需使用vector<int>. 并且Test对象也可以使用自动生命周期创建。

仅仅因为其他一些语言(即 Java)使所有东西都成为句柄并不意味着这对 C++ 来说是一个好的模式。

于 2012-09-27T02:37:37.517 回答