gpt4 book ai didi

c++ - 使用 shared_ptr 的示例?

转载 作者:IT老高 更新时间:2023-10-28 12:01:52 24 4
gpt4 key购买 nike

您好,我今天问了一个关于 How to insert different types of objects in the same vector array 的问题我在那个问题中的代码是

 gate* G[1000];
G[0] = new ANDgate() ;
G[1] = new ORgate;
//gate is a class inherited by ANDgate and ORgate classes
class gate
{
.....
......
virtual void Run()
{ //A virtual function
}
};
class ANDgate :public gate
{.....
.......
void Run()
{
//AND version of Run
}

};
class ORgate :public gate
{.....
.......
void Run()
{
//OR version of Run
}

};
//Running the simulator using overloading concept
for(...;...;..)
{
G[i]->Run() ; //will run perfectly the right Run for the right Gate type
}

我想使用 vector ,所以有人写道我应该这样做:

std::vector<gate*> G;
G.push_back(new ANDgate);
G.push_back(new ORgate);
for(unsigned i=0;i<G.size();++i)
{
G[i]->Run();
}

但后来他和其他许多人建议我最好使用 Boost pointer containers
shared_ptr。我花了最后 3 个小时阅读有关此主题的内容,但文档对我来说似乎相当先进。 ****谁能给我一个shared_ptr用法的小代码示例以及他们为什么建议使用shared_ptr。还有其他类型,例如 ptr_vectorptr_listptr_deque** **

Edit1:我也阅读了一个代码示例,其中包括:

typedef boost::shared_ptr<Foo> FooPtr;
.......
int main()
{
std::vector<FooPtr> foo_vector;
........
FooPtr foo_ptr( new Foo( 2 ) );
foo_vector.push_back( foo_ptr );
...........
}

而且我不懂语法!

最佳答案

使用 vectorshared_ptr消除了内存泄漏的可能性,因为您忘记遍历 vector 并调用 delete在每个元素上。让我们逐行浏览示例的略微修改版本。

typedef boost::shared_ptr<gate> gate_ptr;

为共享指针类型创建别名。这避免了 C++ 语言中由于键入 std::vector<boost::shared_ptr<gate> > 而导致的丑陋。并忘记了结束大于号之间的空格。

    std::vector<gate_ptr> vec;

创建一个空 vector boost::shared_ptr<gate>对象。

    gate_ptr ptr(new ANDgate);

分配一个新的ANDgate实例并将其存储到 shared_ptr .单独执行此操作的原因是为了防止在操作抛出时可能发生的问题。在这个例子中这是不可能的。 Boost shared_ptr "Best Practices"解释为什么分配到独立对象而不是临时对象是最佳实践

    vec.push_back(ptr);

这会在 vector 中创建一个新的共享指针并复制 ptr进去。 shared_ptr 中的引用计数确保 ptr 内部的分配对象被安全地转移到 vector 中。

没有解释的是 shared_ptr<gate> 的析构函数确保分配的内存被删除。这是避免内存泄漏的地方。 std::vector<T> 的析构函数确保 T 的析构函数为存储在 vector 中的每个元素调用。但是,指针的析构函数(例如 gate*)不会删除您分配的内存。这就是你试图通过使用 shared_ptr 来避免的。或 ptr_vector .

关于c++ - 使用 shared_ptr 的示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3476938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com