现在,我的 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/