C++ 用new和delete在宏中实现C realloc

C++ 用new和delete在宏中实现C realloc,c++,macros,new-operator,realloc,C++,Macros,New Operator,Realloc,我正在使用一个库,它允许我重写它的一些宏,以了解它如何分配给堆 #define STBI_MALLOC(sz) malloc(sz) #define STBI_REALLOC(p,newsz) realloc(p,newsz) #define STBI_FREE(p) free(p) 我希望通过使用delete[](char*)p将STBI_FREE()宏与我通常释放此类内存的方式同义,从而将它的一部分分配到我的程序堆中,而不必包装它或过多

我正在使用一个库,它允许我重写它的一些宏,以了解它如何分配给堆

#define STBI_MALLOC(sz)           malloc(sz)
#define STBI_REALLOC(p,newsz)     realloc(p,newsz)
#define STBI_FREE(p)              free(p)
我希望通过使用
delete[](char*)p将
STBI_FREE()
宏与我通常释放此类内存的方式同义,从而将它的一部分分配到我的程序堆中,而不必包装它或过多担心它的分配方式

不过,我不确定STBI\u 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;
}
或者这个也很好用

#define REALLOC_SIZED(p,oldsz,newsz) \
    ((newsz) <= (oldsz) ? (void*)(p) : \
    memcpy(new char[newsz], (void*)std::unique_ptr<char>((char*)(p)).get(), oldsz))
#定义实际大小(p、oldsz、newsz)\

((newsz)TL;DR-无法完成,请保持代码不变

< C++ >没有代码> RealCalc>/Cult>可能性。 ReLoCU违背C++的面向对象性质,因为对象不能像这样移动,所以C++彻底驳斥了这个想法。 也不能用
new
delete
来实现,因为您需要知道当前的数组大小才能复制数据,这是不可能的(以可移植的方式),更不用说每次都要复制数据是低效的(
realloc
在许多情况下都可以正常工作)


<好消息是,在C++程序中使用<代码> MalC/C >代码>代码> ReLoC/和<代码>免费< /代码>,内置C++代码>新< <代码> >代码>删除>代码>在很多情况下委托给<代码> Malc C <代码>和<代码>免费<代码>,所以没有问题。一个坏主意。如果它需要
realloc
,那么您应该使用C库函数。否则,您需要更改调用以同时存储分配的大小并在其后返回指针。这基本上是内存管理器内部所做的,因此您复制了行为(即浪费内存).
new
delete
不是
malloc
free
的直接替代品,也没有
realloc
的等价物。我认为没有一种可移植的方法可以从指针获取分配大小,您需要将该信息保留在一旁,可能需要在开始时插入额外的数据r分配内存,这将保持分配数据的大小。或者您可以编写自己的分配器,跟踪其所有分配,并将其公开给库。@paddy-啊,我知道。我试图避免使用malloc,尽管我喜欢它在更多情况下的行为,因为将它与新分配混合使用是一种真正的资源错误,使用新的是不可避免的。我想我应该把两者结合起来,并善于将正确的分配/解除分配配对起来calls@G.M.我想通过尽可能不受干扰地更改库来避免包装分配,只是为了“人体工程学”。然后,我遇到了一个让我更好奇的问题,我想知道这是否可以做到。像你这样调查并发现问题是没有问题的。结果是你问了一个公平的问题,并得到了一些反馈。这可能不是你期望的反馈,但这就是你拓宽h的方式猎户座。
#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))