如何在不使用const的情况下防止删除指针?

hd1*_*112 0 c++ design-patterns

我有一个包含对象指针向量的类.我在该类中有一个GetObject(..)函数,它通过向量查找,找到所需的对象,并返回指向它的指针.但是,如果该类的用户对该返回的指针执行了delete(),则我的程序将崩溃,因为该向量仍然具有指向该对象的指针,该对象现在是无效的.因此,在我的GetObject()类中,我可以返回一个const指针,但这并不能解决问题,因为您仍然可以删除该对象.该对象是可变的,所以我不能返回指向const对象的指针.我想我可以通过返回对象的引用来阻止删除但是如果有错误我的函数返回NULL.我想我可以通过参数传回对象引用,然后像这样返回和错误号

//-1 on object on found. 0 for success. Object is passed back in 
// the function parameter result.
int MyObject::GetObject(int object_id, Item& result)
Run Code Online (Sandbox Code Playgroud)

对于这种情况,这是最好的解决方案吗?

Jam*_*lis 6

解决此问题的最佳方法是使用共享所有权智能指针shared_ptr,您可以在Boost,C++ TR1和C++ 0x中找到它.

智能指针是一个容器,可以为您管理动态分配的对象的生命周期.delete完成使用后,它负责对象.

使用共享所有权智能指针,您可以拥有多个智能指针,这些指针都共享动态分配对象的所有权.保留引用计数以跟踪有多少智能指针具有对象的所有权,并且当最后拥有的智能指针被销毁时,动态分配的对象是deleted.

在C++中手动管理资源是非常困难的,并且编写看起来正确且大部分时间正常工作但仍然不正确的代码非常容易.通过使用智能指针和其他资源拥有容器(如标准库容器),您不再需要手动管理资源.当您的所有资源管理都是自动的时,编写正确的代码要容易得多.

C++中的自动资源管理是使用称为资源获取初始化(RAII)的设计模式来完成的,这可以说是您作为C++程序员应该熟悉的最重要的设计模式.