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

时间:2014-12-11 09:42:20

标签: c++

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

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,如果它的数组)如何实现?< / p>

2 个答案:

答案 0 :(得分:1)

正如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

答案 1 :(得分:1)

当你有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; } );

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