c++ - shared_ptr如何检测是否必须调用delete []或delete

标签 c++ boost shared-ptr

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

一种。 boost::shared_ptr <char> ptr(new char);
b。 boost::shared_ptr <char []> ptr(new char[100]);

最佳答案

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

#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<T[]>实例化,因此编译时多态性是通过模板专用化完成的,并且smart_ptr借助此功能处理数组和普通类型的释放。

关于c++ - shared_ptr如何检测是否必须调用delete []或delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60293622/

相关文章:

c++ - shared_ptr 模板参数无效

c++ - 错误 2664 - 无法从 std::vector<...> 转换为 std::tr1::shared_ptr

c++ - 重载方法未在强制转换运算符重载中调用

c++ - 为什么 Qt 不将调试消息发送到 Windows 中的 std 错误流?

c++ - 在 C++ 中将类构造函数分配给带有参数的新构造函数

boost - 无法在Windows 7 64位上的Cygwin下编译Boost 1.50.0

c++ - 它如何使用 boost.asio.deadline_timer 在一个线程中完成 "async_wait"以外的其他工作

c++ - 如何配置 AzerothCore 模块与外部库链接?

c++ - 使用 boost 缓冲区进行操作

c++ - 错误:没有匹配函数来调用‘std::map<std::__cxx11::basic_string<char>