C++智能指针实例详解

2020-01-06 12:36:29于海丽

    boost::scoped_array 便是用于管理动态数组的。跟 boost::scoped_ptr 一样,也是独享所有权的。

我们还是从代码开始分析:


void TestScopedArray() {
   boost::scoped_array<Simple> my_memory(new Simple[2]); // 使用内存数组来初始化
   if (my_memory.get()) {
    my_memory[0].PrintSomething();
    my_memory.get()[0].info_extend = "Addition";
    my_memory[0].PrintSomething();
    (*my_memory)[0].info_extend += " other";      // 编译 error,scoped_ptr 没有重载 operator*
    my_memory[0].release();               // 同上,没有 release 函数
    boost::scoped_array<Simple> my_memory2;
    my_memory2 = my_memory;               // 编译 error,同上,没有重载 operator=
   }
  }

boost::scoped_array 的使用跟 boost::scoped_ptr 差不多,不支持复制,并且初始化的时候需要使用动态数组。另外,boost::scoped_array 没有重载“operator*”,其实这并无大碍,一般情况下,我们使用 get() 函数更明确些。

下面肯定应该讲 boost::shared_array 了,一个用引用计数解决复制、参数传递的智能指针类。
 
6、boost::shared_array
boost::shared_array 属于 boost 库,定义在 namespace boost 中,包含头文件 #include<boost/smart_ptr.hpp> 便可以使用。

由于 boost::scoped_array 独享所有权,显然在很多情况下(参数传递、对象赋值等)不满足需求,由此我们引入 boost::shared_array。跟 boost::shared_ptr 一样,内部使用了引用计数。

我们还是从代码开始分析:


void TestSharedArray(boost::shared_array<Simple> memory) { // 注意:无需使用 reference (或 const reference)
 std::cout << "TestSharedArray UseCount: " << memory.use_count() << std::endl;
}
 
void TestSharedArray2() {
 boost::shared_array<Simple> my_memory(new Simple[2]);
 if (my_memory.get()) {
  my_memory[0].PrintSomething();
  my_memory.get()[0].info_extend = "Addition 00";
  my_memory[0].PrintSomething();
  my_memory[1].PrintSomething();
  my_memory.get()[1].info_extend = "Addition 11";
  my_memory[1].PrintSomething();
  //(*my_memory)[0].info_extend += " other"; // 编译 error,scoped_ptr 没有重载 operator*
 }
 std::cout << "TestSharedArray2 UseCount: " << my_memory.use_count() << std::endl;
 TestSharedArray(my_memory);
 std::cout << "TestSharedArray2 UseCount: " << my_memory.use_count() << std::endl;
}

执行结果为:


Simple: 0
Simple: 0
PrintSomething:
PrintSomething: Addition 00
PrintSomething:
PrintSomething: Addition 11
TestSharedArray2 UseCount: 1
TestSharedArray UseCount: 2
TestSharedArray2 UseCount: 1
~Simple: 0
~Simple: 0