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

时间:2012-04-10 10:07:00

标签: memory-management new-operator placement-new

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

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

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

2 个答案:

答案 0 :(得分:0)

它是数据类型或typedef。

答案 1 :(得分: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是指向char的指针,p是指向sample的指针。现在,我们无法看到sample是什么,但是我们可以假设它是一个定义在其他地方的类,或者是某些已被typedef编辑的数据类型(或多或少只是一个新的名称)但无论哪种方式,sample都可以被视为数据类型,只需链接intstring

第2行是分配一块内存并为其分配char pointer名为buf的内存。让我们说样本是一个包含2个int的类,这意味着它(在大多数编译器下)将是8个字节(每个int 4个)。因此buf指向已留出来保留char s的内存块的开头。

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

最终效果是,你有一个内存块分配(或多或少8个字节),它有两个指向它的指针。其中一个点buf正在将该内存视为8个字符,其他buf正在查看的是p

你为什么要这样做?

通常,你不会。现代C ++使sample的起诉变得多余,有许多更好的方法来处理对象。我想使用这种方法的主要原因是,如果出于某种原因你想要保留一个内存池,因为它需要一些时间来获得大块内存,你可能可以节省一些时间。

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

A Extra Extra

我对嵌入式或移动设备没有太多经验,但我从未见过这种用途。

您发布的代码与执行new的代码基本相同,两种方法都没有控制sample *p = new sample(10,20)对象的创建位置。

另外请注意,您并不总是需要使用new来动态创建对象。

sample

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

如果你确实需要使用动态对象,可以考虑使用智能指针,例如sample。这将使你能够使用动态对象创建但是省去了手动删除对象的麻烦。输入unique_ptr<sample>(如果你有生命,我可以指出你有关这方面的更多信息)