我有一个被调用的类来释放内存,如下所示:
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>
答案 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*
类型的东西时,你实际上无法知道它是如何分配的,因此你不能以通用的方式正确地销毁它。这不仅仅是new
或new[]
的问题,对象可以使用malloc,依赖于操作系统的分配器,对象池等进行分配。
根据您的目标,std::unique_ptr
可能是最佳解决方案,它只能处理new/delete
和new[]/delete[]
,但在大多数情况下它就足够了。
此外,std :: shared_prt是一个选项,您可以指定如何解除分配对象:
//c++11
std::shared_ptr<int> sp( new int[10], []( int *p ) { delete[] p; } );
如果您想拥有自己的内存管理系统,请考虑在同一位置分配和取消分配对象。