C++11 我应该在这里使用智能指针吗?
我已经阅读了一些关于类似问题的答案,但我仍然不清楚什么时候是使用智能指针的好时机。我有一个类C++11 我应该在这里使用智能指针吗?,c++11,smart-pointers,C++11,Smart Pointers,我已经阅读了一些关于类似问题的答案,但我仍然不清楚什么时候是使用智能指针的好时机。我有一个类Foo,看起来像这样: class Bar; class Baz; class Foo { public: Foo(Bar* param1, std::vector<Baz*>& param2); virtual ~Foo(); // Method using myBar and myBaz polymorphically... private:
Foo
,看起来像这样:
class Bar;
class Baz;
class Foo
{
public:
Foo(Bar* param1, std::vector<Baz*>& param2);
virtual ~Foo();
// Method using myBar and myBaz polymorphically...
private:
Bar* myBar;
std::vector<Baz*> myBaz;
};
类条;
Baz类;
福班
{
公众:
Foo(Bar*param1,std::vector和param2);
虚拟~Foo();
//方法使用myBar和myBaz多态性。。。
私人:
酒吧*我的酒吧;
std::载体myBaz;
};
我需要两个数据成员作为多态性的指针。这是一部分
我担心的是有人会写:
int main()
{
//...
std::vector<Baz*> allOnHeap {new Baz(), new Baz()};
Foo(new Bar(), allOnHeap);
// ...
}
intmain()
{
//...
std::vector allOnHeap{new Baz(),new Baz()};
Foo(新条(),allOnHeap);
// ...
}
这是合法的,但会导致内存泄漏。我可以在中添加delete
s
析构函数,但是如果没有动态分配呢
…制造的在你看来,使用smart是个好主意吗
这种情况下的指针?请解释你的意见。如果您对如何做到这一点有更好的想法,请随时分享。在这种情况下,智能指针不会立即出现在脑海中,主要是因为不清楚所有权要求是什么。如果您遵循的是C++核心指南建议,那么很明显,<代码>类FoO < /C>不打算拥有<代码> Bar <代码>和<代码> Baz < /Cord>对象,不应该删除它们。 如果您的目的可能是有时获得对象的所有权,有时不获得所有权,我建议您考虑另一种设计,在这种设计中,您可以选择单一功能并坚持使用它(: 我已经读过一些关于类似问题的答案,但我仍然感到困惑 困惑于何时是使用智能指针的好时机。我有一个 类Foo,如下所示:
class Bar;
class Baz;
class Foo
{
public:
Foo(Bar* param1, std::vector<Baz*>& param2);
virtual ~Foo();
// Method using myBar and myBaz polymorphically...
private:
Bar* myBar;
std::vector<Baz*> myBaz;
};
在你提到的情况下,我会使用智能指针
unique\u ptr
和std::vector
可在保留类作用域的末尾进行自动清理unique\u ptr
:每个弱ptr表示使用类(通过弱ptr访问的类)没有所有权语义,在使用之前必须尝试获得临时所有权(通过锁定提供共享ptr)std::vector
顺便说一句,您不必显式删除默认构造函数。有关详细信息。智能指针都与所有权有关。这个问题归结为您是否希望
Foo
拥有它所指向的对象。如果不想,那么您的代码就可以了,Foo
的用户需要管理对象的生命周期。如果它们泄漏,就这样吧,不是Foo
的错。但是,如果你想Foo
拥有所有权,那么将myBar
更改为std::unique\u ptr
或std::shared\u ptr
,并将myBaz
更改为std::vector
或std::vector
。那么谁拥有什么就没有任何问题了。是的,这是标准之一标准情况下,std::unique_ptr
s是有用的。@RemyLebeau在哪种情况下,我可以不关心我的类可能会产生内存泄漏的事实?在我看来,原始指针数据成员总是会导致这种问题。我错了吗?@BobMorane再次强调,这是所有权的问题。Foo
不分配e对象。如果它没有获得给定对象的所有权,它就没有必要使用指向它们的智能指针(或者,至少,它可以通过std::shared_ptr
)使用共享所有权。您已经说明了一个需要原始指针的上下文-“没有进行动态分配”旁注:Foo()=delete;
在这里是多余的。也许智能指针应该总是跳转到脑海中来定义所有权语义应该是什么。