如何在固定位置使用 new 分配内存?我的书说要这样做:
char *buf=new char[sizeof(sample)];
sample *p=new(buf)sample(10,20);
这里 new 是在 buf 的地址分配内存, (10,20) 是正在传递的值。但什么是样本?它是地址还是数据类型?
如何在固定位置使用 new 分配内存?我的书说要这样做:
char *buf=new char[sizeof(sample)];
sample *p=new(buf)sample(10,20);
这里 new 是在 buf 的地址分配内存, (10,20) 是正在传递的值。但什么是样本?它是地址还是数据类型?
它是数据类型或 typedef。
让我向你解释这段代码......
char *buf=new char[sizeof(sample)];
sample *p=new(buf)sample(10,20);
这实际上是四行代码,为方便起见,写成两行。让我扩展它们
char *buf; // 1
buf = new char[sizeof(sample)]; // 2
sample *p; // 3
p = new(buf)sample(10,20); // 4
第 1 行和第 3 行很容易解释,它们都是声明指针。buf
是指向 a 的指针char
,p
是指向 a 的指针sample
。现在,我们看不到它是什么sample
,但我们可以假设它是在 else where 定义的类,或者是一些已被typedef
编辑的数据类型(或多或少只是给了一个新名称),但无论哪种方式,sample
都可以被认为是数据类型只是链接int
或string
第 2 行是分配一块内存并将其分配给我们char pointer
调用的buf
. 假设 sample 是一个包含 2 个 int 的类,这意味着它(在大多数编译器下)将是 8 个字节(每个 int 4 个)。sobuf
指向一块内存的开始,该内存块已被预留用于存放char
s。
第 4 行是一个大复杂的地方。如果它只是p = new sample(10,20)
创建一个类型的新对象sample
,将两个int
s 传递给它并将这个新对象的地址存储在指针中,这将是一个简单的情况p
。添加(buf)
基本上是在告诉new
使用指向的内存buf
。
最终效果是,您分配了一块内存(或多或少 8 个字节),并且它有两个指向它的指针。其中一个点 ,buf
将内存视为 8 个字符,另一点 ,p
正在查看的是单个sample
.
你为什么要这样做?
通常情况下,你不会。现代 C++ 使 sue 变得new
相当多余,有许多更好的方法来处理对象。我想使用这种方法的主要原因是,如果出于某种原因您想保持分配的内存池,因为获得大块内存可能需要一些时间,并且您可能会节省一些时间。
在大多数情况下,如果你认为你需要做这样的事情,你是在试图解决错误的事情
额外的一点
我对嵌入式或移动设备没有太多经验,但我从未见过使用它。
您发布的代码基本上与仅执行sample *p = new sample(10,20)
两种方法都无法控制sample
对象的创建位置相同。
还要考虑到您并不总是需要使用 new 动态创建对象。
void myFunction(){
sample p = sample(10,20);
}
这会自动为您创建一个sample
对象。这种方法更可取,因为它更易于阅读和理解,并且您无需担心删除对象,当函数返回时它将为您清理。
如果您确实需要使用动态对象,请考虑使用智能指针,例如unique_ptr<sample>
这将使您能够使用动态对象创建,但省去了手动删除类型对象的麻烦sample
(我可以为您指出更多如果你还活着,这方面的信息)