【问题标题】:C++ smart pointer to statically and dynamically allocated resource指向静态和动态分配资源的 C++ 智能指针
【发布时间】:2010-10-25 12:00:35
【问题描述】:

我的基类需要公开一个方法,该方法对于某些派生类将返回一个指向动态分配数组的智能指针,而对于某些其他派生类将返回一个指向静态分配数组的指针/引用。

示例:

class Base
{
  public:
  virtual ??? foo()=0;
}

class A : public Base
{ 
  private:
  float arr[10];   
  public:
  ??? foo(){ return ???arr; }
}

class B : public Base
{
  public:
  ??? foo(){ 
      allocate array;
      return ???array; 
  }
}

动态分配的数组是在类方法中创建的,我更喜欢使用std::unique_ptr。但是A类中的静态分配数组该怎么办呢?

我是否应该创建自己的从std::unique_ptr 派生的类,它会知道指针分配并且不会尝试破坏静态分配的指针,或者可能已经存在这样的智能指针?

【问题讨论】:

  • 该代码中没有任何静态分配的数组。这可能是个问题......无论如何,如果你有这样一个数组,那么boost::shared_ptr w/custom deleter 将是一种选择。但是,它有一些开销。如果开销被证明是不可接受的,您可以根据boost::intrusive_ptr 创建自己的,它没有开销问题(动态分配)。
  • 从内存中,std::shared_ptr 提供了一个构造函数,它可以“拥有”一个对象,但实际上指向另一个对象,正是为了这个目的。不过,我实际上在 MSDN 上找不到任何证据,而且我实际上也无法编写任何使用它的代码。

标签: c++ smart-pointers


【解决方案1】:

您可以为Boost smart pointers 提供自定义删除器。这也可以是一个不做任何事情的空函数。对于返回动态分配数组的类,您可以使用标准shared_array,对于返回指向静态分配数组的指针的类,您可以返回带有空自定义删除器的shared_array

请注意,您的问题在这里更深层次。返回将由调用者拥有的指针与返回由对象拥有的指针是完全不同的。您可能需要考虑不要将这两者混合在同一个函数中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-03
    • 2022-01-24
    • 2022-01-14
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多