只想澄清有关shared_ptr
的信息int main(){
typedef std::tr1::shared_ptr<Foo> _foo;
_foo obja(new Foo());
Foo *objb = obja.get();
// delete objb; //deleting objb will throw double free or corruption
return 0;
}
在上面的代码中,如果 objb 未被删除或释放,是否存在内存泄漏?最后, obja 将超出范围并将自由。由于 objb 和 obja 指向同一个实例,这是否意味着不需要释放 objb ?
以上是否与此相同:
Foo *obja = new Foo();
Foo *objb;
objb = obja;
delete obja;
答案 0 :(得分:6)
不,没有泄漏。原始指针没有任何所有权语义,get
来自shared_ptr
的原始指针也不会增加引用计数。
当共享指针超出示例范围时,指向的对象将被销毁。正如您已经注意到的那样,手动删除它会导致未定义的行为。
答案 1 :(得分:4)
在上面的代码中,如果未删除或释放objb,是否存在内存泄漏?
否。 Foo
对象归obja
共享指针所有。通过执行.get()
,您可以检索“哑”,观察对指向对象的生命周期没有任何影响的指针。在指向的对象不再存在之后,您必须小心不要取消引用它,否则您将获得未定义的行为。
由于objb和obja指向相同的实例,这意味着没有必要释放objb?
不需要释放objb
,因为当obja
超出范围时,其析构函数将delete
拥有的对象。如果您执行了delete objb
,则会通过尝试删除对象两次来获得未定义的行为。
以上是否与此相同:
我想有人可以这样说,是的。
答案 2 :(得分:1)
不,没有泄漏。 obja
仍拥有内存,并在范围退出时销毁obja
时释放。获取指针并不等同于释放其所有权(q.v。release()
)。所以你通过get()
获得一个弱(非拥有)指针,只要实际所有者存在,它就是有效的,但如果原始指针超过拥有者shared_ptr
,则它是一个悬空指针。 / p>
答案 3 :(得分:0)
我认为上面的大多数答案表明他们不明白你的困惑在哪里 所以C和C ++中的指针只是一个内存地址。当您将一个原始指针“复制”到另一个原始指针时,它们都指向同一地址:
int *ptr1 = new int(); // points to memory at address lets say 1234;
int *ptr2 = ptr1; // now also points to 1234
*ptr1 = 10; // modify int where ptr1 points to
std::cout << *ptr2 << std""endl; // print 10 as ptr2 points to the same place as ptr1
delete ptr1; // I do not need memory at address 1234 anymore
delete ptr2; // I do not need memory at address 1234 again, error double deletion
您可以将指针视为数字,当您将一个指针指定给另一个指针时,只需复制该数字,该地址的内存就不会发生任何事情。