如果我声明一个包装在共享指针中的对象:
std::shared_ptr<myClass> myClassObject(new myClass());
然后我想把它作为参数传递给一个方法:
DoSomething(myClassObject);
//the called method
void DoSomething(std::shared_ptr<myClass> arg1)
{
arg1->someField = 4;
}
上面的代码只是简单地增加了shared_pt的引用计数,然后一切都变好了吗?或者它会留下一个悬空的指针?
你还应该这样做吗?:
DoSomething(myClassObject.Get());
void DoSomething(std::shared_ptr<myClass>* arg1)
{
(*arg1)->someField = 4;
}
我认为第二种方法可能更有效,因为它只需要复制1个地址(而不是整个智能指针),但第一种方法似乎更具可读性,我不希望突破性能限制。我只想确定这里面没有什么危险。
谢谢。
发布于 2012-05-31 11:39:22
我认为人们不必要地害怕使用原始指针作为函数参数。如果函数不打算存储指针或以其他方式影响其生存期,则原始指针也同样有效,并代表最低公分母。例如,考虑如何通过值或常量引用将unique_ptr
传递到以shared_ptr
为参数的函数中?
void DoSomething(myClass * p);
DoSomething(myClass_shared_ptr.get());
DoSomething(myClass_unique_ptr.get());
将原始指针作为函数参数并不会阻止您在调用代码中使用智能指针,这一点非常重要。
发布于 2012-05-31 10:07:17
是的,关于shared_ptr<>的整个想法是,多个实例可以持有相同的原始指针,只有当shared_ptr<>的最后一个实例被销毁时,才会释放底层内存。
我会避免指向shared_ptr<>的指针,因为这与您现在再次处理raw_pointers的目的背道而驰。
发布于 2012-05-31 10:07:24
在您的第一个示例中按值传递是安全的,但是有一个更好的习惯用法。在可能的情况下传递const引用-即使在处理智能指针时我也会同意。您的第二个示例并没有完全失效,但它非常!???
。愚蠢,什么也做不了,违背了智能指针的一部分,当你试图取消引用和修改东西时,会让你陷入痛苦的世界。
https://stackoverflow.com/questions/10826541
复制相似问题