gpt4 book ai didi

C++ - 如何安全地包装 malloc 或使用 new 运算符进行仿真

转载 作者:太空狗 更新时间:2023-10-29 21:20:01 25 4
gpt4 key购买 nike

<分区>

是否有普遍接受的安全包装方法 malloc在 C++ 的函数中?我试图做的是分配任意大小的内存块,用于保存将二进制值写入固定大小缓冲区(即:机器指令)的函数的输出。我目前使用的方法是这样的:

class voidp {
void *p;
public:
voidp (void *pp) : p (pp) {}
template<class T> operator T *() { return (T *) p; }
};

When converting C to C++, you can define malloc like this:

inline voidp
mymalloc (size_t size)
{
return malloc (size);
}
#define malloc mymalloc

在许多情况下,这似乎是对 (void*) 的显式转换(至少在我的编译器的情况下)是不允许的,我必须使用上面基于模板的方法。

这种方法是否安全,是否对“三规则”有任何影响(即:是否需要禁用或显式定义/重载任何构造函数)?

谢谢。

引用资料

  1. 我对 C++ 的 operator new 的咆哮——在类型系统中打一个整体,2014 年 9 月 5 日访问, <http://www.scs.stanford.edu/~dm/home/papers/c++-new.html>
  2. 解决难倒我的 C 面试问题中的内存对齐,访问时间 2014-09-05, <https://stackoverflow.com/questions/227897/solve-the-memory-alignment-in-c-interview-question-that-stumped-me>

编辑


我这样做的原因是因为我试图使用一些可能比通过 void* buffer = new char[100] 分配一个字符 block 更好的东西。 .为了进一步详细说明,我正在编写一些较低级别的代码,根据我的建议,这些代码必须用 C++ 编写,而不是纯 C。我还需要具有创建内存块的动态内存分配方法在 16 字节、32 字节和 64 字节对齐的堆上,如下例中的 16 字节对齐。

{
void *mem = malloc(1024+15);
void *ptr = ((uintptr_t)mem+15) & ~ (uintptr_t)0x0F;
memset_16aligned(ptr, 0, 1024);
free(mem);
}

我的应用程序确实在 block 中创建了一组低级机器指令,这些指令必须按 16/32/64 字节对齐(否则会触发 CPU 级错误),然后将它们传递给板载 DSP 芯片,它将它们作为实际指令运行,而不仅仅是输入数据。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com