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

标签 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

智能指针在这种情况下会提供什么好处(如果有的话)?

最佳答案

您应该担心的不是创建,而是删除。

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

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

无论如何,智能指针在你的代码中明确了所有权,不仅对你和你的队友,而且对编译器——做错了可能会产生编译器错误,或者相对容易的运行时错误 catch 防御性编码。在手动内存管理的代码中,很容易在某处弄错所有权情况(由于误读注释或以错误的方式假设),并且由此产生的错误通常很难追踪 - 你会泄漏内存,覆盖东西那不是你的,程序随机崩溃,等等;这些都有一个共同点,即错误发生的情况与有问题的代码部分无关。

关于c++ - 手动对象所有权与智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4470218/

相关文章:

c++ - 类声明错误

c++ - 我自己的智能指针,double free or corruption (fasttop)

c++ - 为什么 weak_ptr 可以打破循环引用?

C++ 将 int 添加到 int 数组

c++ - 将 vector 的元素求和分配给另一个 vector 的元素的并行算法

c++ - 如果另一个指针指向它的引用,为什么 const int 不会被编译器(通过符号表)优化?

c++ get方法不返回指向节点的指针

C++ 智能指针范围和资源删除

c++ - 如何在 Windows 中从任何格式转换为 PCM

c++ - 将 wchar 转换为字符串并插入 vector (C/C++)