Memory management 如何在预定位置分配内存?

Memory management 如何在预定位置分配内存?,memory-management,new-operator,placement-new,Memory Management,New Operator,Placement New,如何在固定位置使用new分配内存?我的书上说要做到这一点: char *buf=new char[sizeof(sample)]; sample *p=new(buf)sample(10,20); 这里新的是在buf地址分配内存,10,20是传递的值。但什么是样品?它是地址还是数据类型?它是数据类型还是类型定义。让我向您解释一下这段代码 char *buf=new char[sizeof(sample)]; sample *p=new(buf)sample(10,20); 这实际上是四行代码

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

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

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

它是数据类型还是类型定义。

让我向您解释一下这段代码

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是指向字符的指针,p是指向示例的指针。现在,我们看不出sample是什么,但我们可以假设它是在别处定义的一个类,或者是一些数据类型,这些数据类型或多或少被定义为一个新名称,但不管怎样,sample都可以被认为是一个数据类型,只是linkint或string

第2行是分配一个内存块并为其分配一个名为buf的字符指针的过程。假设sample是一个包含2个整数的类,这意味着在大多数编译器下,它将是8个字节,每个整数4个字节。因此buf指向一个内存块的开始,该内存块已被预留用于保存字符

第四行是一个大的综合体。如果它只是p=newsample10,20,那么创建一个sample类型的新对象,将两个int传递给它,并将这个新对象的地址存储在指针p中就是一个简单的例子。buf的添加基本上是告诉new使用buf指向的内存

最终的效果是,您有一个内存块分配了大约8个字节,它有两个指针指向它。其中一个点,buf,是把内存看作8个字符,另一个点,p,是一个样本

你为什么要这样做

通常,你不会。现代C++已经提出了新的相当冗余的方法,有很多更好的方法来处理对象。我想,使用这种方法的主要原因是,如果出于某种原因,您希望保持分配的内存池,因为获取大块内存可能需要时间,并且您可能会节省一些时间

在大多数情况下,如果你认为你需要做这样的事情,你是在试图解决错误的事情

多一点

我在嵌入式或移动设备方面没有太多经验,但我从未见过使用这种设备

您发布的代码基本上与执行sample*p=newsample10,20相同,这两种方法都不控制sample对象的创建位置

还认为,您并不总是需要使用NeX./P>动态创建对象。

void myFunction(){
    sample p = sample(10,20);
}
这会自动为您创建一个示例对象。此方法更可取,因为它更易于阅读和理解,并且您不需要担心删除对象,当函数返回时,它将为您清理


如果你真的需要使用动态对象,考虑使用智能指针,比如UnQuyjpTR,这将给你使用动态对象创建的能力,但是节省你手动删除样本类型对象的麻烦,如果你的生命

@ theHthman,我可以向你指出更多的信息,我是StAccOffFuff.com的新手,很好,我现在将记住这一点,并接受更多的回答。我的书中说,在移动设备和其他嵌入式系统的编程环境中,阵列需要新的配置。这本书是由Yahsavant Kanetkar给我们C++的,我有点说,所以更新答案给你,这不是我的意思。Sample是一个类,但我要问的是最后一行中的Sample指示了什么。@Nirvan:我明白了,你指的是最后一行中Sample的第二次出现。我以为你指的是第一个。