手动对象所有权与智能指针

jam*_*o00 4 c++ pointers smart-pointers ownership

现在,我的C++项目中的对象所有权/删除是手动跟踪的(主要通过评论).几乎每个堆分配的对象都是使用各种工厂创建的

例如

auto b = a->createInstanceOfB(); //a owns b
auto c = b->createInstanceOfC(); //b owns c
//auto k = new K(); //not in the code
...
//b is no longer used..
a->destroyInstanceOfB(b); //destroyInstanceOf calls delete on it
Run Code Online (Sandbox Code Playgroud)

智能指针在这种情况下会带来哪些好处(如果有的话)?

tda*_*ers 9

这不是你应该担心的创作,而是删除.

使用智能指针(引用计数类型),对象可以共同拥有其他几个对象,当最后一个引用超出范围时,将自动删除该对象.这样,您就不必再手动删除任何内容了,只有当您具有循环依赖关系时才能泄漏内存,并且您的对象永远不会从您背后的其他地方删除.

单一所有者类型(std::auto_ptr)也可以减轻您的删除义务,但它一次只允许一个所有者(尽管可以转让所有权).这对于作为指针传递的对象很有用,但是当它们超出范围时仍然希望它们自动清理(这样它们在容器中运行良好,并且在异常情况下展开的堆栈按预期工作).

在任何情况下,智能指针都会在您的代码中明确所有权,不仅对您和您的团队成员,而且对编译器也是如此 - 做错了可能会产生编译器错误,或者运行时出错,相对容易被捕获防御性编码.在手动内存管理代码中,很容易在某处弄错所有权情况(由于误读评论或假设方法错误),并且产生的错误通常难以追踪 - 你会泄漏内存,覆盖东西这不是你的,程序随机崩溃等; 这些都是共同的,发生错误的情况与违规代码部分无关.

  • 注意:auto_ptr将被c ++ 0x中的unique_ptr取代 (5认同)