0

如何在固定位置使用 new 分配内存?我的书说要这样做:

char *buf=new char[sizeof(sample)];
sample *p=new(buf)sample(10,20);

这里 new 是在 buf 的地址分配内存, (10,20) 是正在传递的值。但什么是样本?它是地址还是数据类型?

4

2 回答 2

0

它是数据类型或 typedef。

于 2012-04-16T14:56:07.333 回答
0

让我向你解释这段代码......

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 的指针charp是指向 a 的指针sample。现在,我们看不到它是什么sample,但我们可以假设它是在 else where 定义的类,或者是一些已被typedef编辑的数据类型(或多或少只是给了一个新名称),但无论哪种方式,sample都可以被认为是数据类型只是链接intstring

第 2 行是分配一块内存并将其分配给我们char pointer调用的buf. 假设 sample 是一个包含 2 个 int 的类,这意味着它(在大多数编译器下)将是 8 个字节(每个 int 4 个)。sobuf指向一块内存的开始,该内存块已被预留用于存放chars。

第 4 行是一个大复杂的地方。如果它只是p = new sample(10,20)创建一个类型的新对象sample,将两个ints 传递给它并将这个新对象的地址存储在指针中,这将是一个简单的情况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(我可以为您指出更多如果你还活着,这方面的信息)

于 2012-04-16T15:07:03.633 回答