需要一个通用析构函数来删除标量以及指针数组

Need a generic destructor fro deleting scalar as well as array of pointers

本文关键字:标量 删除 数组 指针 析构函数 一个      更新时间:2023-10-16

我有一个调用的类来释放内存,如下所示:

template<typename T>
class mymemrel
{
    T ptr;
public:
    mymemrel()
    {
        ptr = NULL;
    }
    mymemrel(T ptrArg)
    {
        ptr = ptrArg;
    }
    void memoryInit(T ptrArg)
    {
        ptr = ptrArg;
    }
    ~mymemrel()
    {
        delete ptr;
    }
};

在析构函数~mymemrel()中,我需要处理标量内存的释放以及指针数组(即,如果其标量删除[] ptr,如果其数组,则删除 ptr)如何实现这一点?

正如kerrek建议的那样,改用std::unique_ptr

#include <memory>
using namespace std;
std::unique_ptr<int> p(new int(1));  //manages a int
std::unique_ptr<int[]> p(new int[10]); //manages entire array of ints

当你有 T* 型的东西时,你实际上无法知道它是如何分配的,因此你不能以通用方式正确地销毁它。这不仅仅是newnew[]的问题,对象可以用malloc,依赖于操作系统的分配器,对象池等进行分配。

根据您的目标,std::unique_ptr可能是最好的解决方案,它只能处理 new/deletenew[]/delete[] ,但在大多数情况下就足够了。

此外,std::shared_prt 是一个选项,您可以指定如何释放对象:

//c++11
std::shared_ptr<int> sp( new int[10], []( int *p ) { delete[] p; } );

如果要拥有自己的内存管理系统,请考虑在同一位置分配和解除分配对象。