【问题标题】:How shared_ptr detects if it has to call delete[] or deleteshared_ptr 如何检测是否必须调用 delete[] 或 delete
【发布时间】:2020-06-03 05:24:40
【问题描述】:

我很想知道,shared_ptr 类如何决定是否必须为以下语句调用deletedelete[]

一个。 boost::shared_ptr <char> ptr(new char);

b. boost::shared_ptr <char []> ptr(new char[100]);

【问题讨论】:

  • 我想你告诉它用参数调用哪个,它要么是<char>要么是<char[]>
  • Boost 有许多类型的“智能”指针,但没有一个称为 boost::smart_ptr
  • 至于你的问题,请对specialization做一些研究。
  • <T> 版本专门默认始终使用delete<T[]> 版本专门用于默认始终使用 delete[]。没有决定要做。模板参数决定使用哪个特化。

标签: c++ boost shared-ptr


【解决方案1】:

这是通过模板专业化完成的。这是简单的演示。

#include <iostream>
#include <type_traits>

template<typename T>
struct foo
{
    foo( T* d ) : m_data{ d } {  }
    ~foo() {
        if ( m_data )
        std::cout << "delete called." << std::endl;
    }

private:
    T* m_data {};
};

template<typename T>
struct foo<T[]>
{
    foo( T* d ) : m_data { d } { }
    ~foo() {
        if ( m_data )
            delete[] m_data;
        std::cout << "delete[] called." << std::endl;
    }
private:
    T* m_data {};
};

int main()
{
    foo<char> inst_1 { new char };
    foo<char []> inst_2 { new char[ 100 ] { 'a' } };
}

online example

对于T[] 类型,struct foo&lt;T[]&gt; 已实例化,因此编译时多态性通过模板特化完成,smart_ptr 在此功能的帮助下处理数组和普通类型的解除分配。

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2018-10-21
    相关资源
    最近更新 更多