如何在固定位置使用new分配内存?我的书说要这样做:
char *buf=new char[sizeof(sample)];
sample *p=new(buf)sample(10,20);
这里新的是在buf的地址分配内存,而(10,20)是传递的值。但样品是什么?是地址还是数据类型?
答案 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
都可以被视为数据类型,只需链接int
或string
第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>
(如果你有生命,我可以指出你有关这方面的更多信息)