需要一个通用析构函数来删除标量以及指针数组
Need a generic destructor fro deleting scalar as well as array of pointers
我有一个调用的类来释放内存,如下所示:
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*
型的东西时,你实际上无法知道它是如何分配的,因此你不能以通用方式正确地销毁它。这不仅仅是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; } );
如果要拥有自己的内存管理系统,请考虑在同一位置分配和解除分配对象。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- MSVC 编译器/链接器何时合成标量/矢量删除析构函数
- bad_alloc::'标量删除析构函数'(无符号整数)当我尝试创建矢量 470MB 大小时
- VS C DLL-标量删除驱动器
- 需要一个通用析构函数来删除标量以及指针数组
- 标量删除析构函数问题
- 为什么在 VC 中,'delete' 和 'delete []' 都使用标量删除析构函数?