Implementing C realloc in a macro with new and delete(在宏中使用NEW和DELETE实现C realloc)
本文介绍了在宏中使用NEW和DELETE实现C realloc的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用一个库,该库允许我覆盖它的一些宏,以确定它如何分配给堆
#define STBI_MALLOC(sz) malloc(sz)
#define STBI_REALLOC(p,newsz) realloc(p,newsz)
#define STBI_FREE(p) free(p)
通过使STBI_FREE()宏与我通常释放此类内存的方式同义词,delete [](char*)p,我希望在不包装它或太担心它是如何分配的情况下,将其中一部分内存分配到我的程序中
#define STBI_MALLOC(sz) ((void*)new char[sz])
#define STBI_REALLOC(p,newsz) ???
#define STBI_FREE(p) (delete [](char*)(p))
但是,我不确定要对STBI_REALLOC()使用什么。如果我有以前的尺码,我可以分多行做,但是...
// STBI_REALLOC(p,newsz)
if (newsz <= ???) { // don't know the allocation size
return p;
} else {
char * next = new char[newsz]
memcpy(next, p, ???); // don't know the allocaion size
delete [] (char*)p;
return (void*)next;
}
...如果本质上不知道分配的大小,则不可能使用宏在库中接受的参数。我是否有可以插入此宏定义的选项?
--编辑-
(接受的答案仍然有效,这超出了原始问题的范围,但我附加了这一点,以防使用相同库的任何人遇到它)
原来这个库有一个隐藏的预处理器部分,用于这种情况,如果库用户定义了它,库将改用STBI_REALLOC_SIZED(p,oldsz,newsz)。
这允许我为库定义以下绝对杰作:
#define STBI_MALLOC(sz) ((void*)(new char[sz]))
#define STBI_REALLOC_SIZED(p,oldsz,newsz)
((newsz) <= (oldsz) ? (void*)(p) : [](void* lp, size_t loldsz, size_t lnewsz)->void*{char*n = new char[lnewsz]; memcpy(n, lp, loldsz); delete [] (char*)lp; return (void*)n;}(p, oldsz, newsz))
#define STBI_FREE(p) (delete [](char*)(p))
或者这个也很好
#define REALLOC_SIZED(p,oldsz,newsz)
((newsz) <= (oldsz) ? (void*)(p) :
memcpy(new char[newsz], (void*)std::unique_ptr<char>((char*)(p)).get(), oldsz))
推荐答案
TL;DR-无法完成,请保留代码原样。
在C++中不存在realloc可能性。realloc与C++面向对象的本质背道而驰,因为对象不能像那样四处移动,所以C++断然拒绝了这一想法。
也不能用new和delete来实现,因为您需要知道当前的数组大小来复制数据,这是不可能的(以可移植的方式),更不用说每次都必须复制东西的低效(realloc在许多情况下都可以就地工作)。
malloc、realloc和free来分配原始内存并没有错。此外,内置的new和delete在许多情况下委托给malloc和free,因此实际上没有问题。
这篇关于在宏中使用NEW和DELETE实现C realloc的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
织梦狗教程
本文标题为:在宏中使用NEW和DELETE实现C realloc
基础教程推荐
猜你喜欢
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- CString 到 char* 2021-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 初始化列表*参数*评估顺序 2021-01-01
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
