Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C和C+中分配和释放*数组*内存+;?_C++_C_Arrays_Memory Management - Fatal编程技术网

C++ 如何在C和C+中分配和释放*数组*内存+;?

C++ 如何在C和C+中分配和释放*数组*内存+;?,c++,c,arrays,memory-management,C++,C,Arrays,Memory Management,我的问题是关于数组,而不是对象 关于malloc()/free()与new/delete,有一些问题是这样的,但所有这些问题都集中在如何使用它们的差异上。我了解它们是如何使用的,但我不明白是什么潜在的差异导致了使用上的差异 我经常听到C程序员说, MARROCKE()/和()(代码)>是昂贵的操作,但我从未听说过C++程序员会说“新< /Cord>”和“代码>删除< /代码>。我还注意到C++没有一个对应于C的代码> RealCube()/< > >的操作。 如果我正在编写一个与C++的vect

我的问题是关于数组,而不是对象

关于
malloc()
/
free()
new
/
delete
,有一些问题是这样的,但所有这些问题都集中在如何使用它们的差异上。我了解它们是如何使用的,但我不明白是什么潜在的差异导致了使用上的差异

我经常听到C程序员说,<代码> MARROCKE()/<代码>和()(代码)>是昂贵的操作,但我从未听说过C++程序员会说“<代码>新< /Cord>”和“代码>删除< /代码>。我还注意到C++没有一个对应于C的代码> RealCube()/< > >的操作。 如果我正在编写一个与C++的
vector
类等价的类,我希望在调整数组大小时避免复制整个数组,但使用
new
delete
时,必须复制。在C语言中,我只需要
realloc()
。值得注意的是,
realloc()
可能只是复制整个数组,但我的印象是它使用了相同的指针,并且为它分配了更少的空间,至少在减小大小时是这样


所以我的问题是,
malloc()
free()
使用的算法与
new
delete
使用的算法有何不同。更具体地说,为什么C方式有一个更昂贵的污名,为什么C++模式不允许复制而不调整大小?

< P>在引擎盖下没有真正的区别-通常是默认<代码>新< /COD>和<代码>删除>代码>操作符将简单地调用<代码> MalOC 和<代码>免费< /代码> 至于“更昂贵的耻辱”,我的理论是:回到过去,每一个周期都是有意义的,而
malloc
所花费的时间在很多情况下都是非常重要的。但是到C++出现的时候,硬件的速度要快得多,自由商店管理者所花费的时间也不那么重要。重点从有效利用机器资源转向高效利用程序员资源


<为什么C++缺少一个代码> ReLoC/等价物,我不知道。

< P>它们基本上使用了相同的分配技术——当然,在大多数实现中,默认的C++运行时新不会比Maloc快得多。最大的区别之一是,你可以在C++中改写分配器,这样你就可以使用优化的内存分配器来优化你的内存行为——当然,C也可以这样做,但是语法上有点麻烦。

< P>“新的和删除可能是昂贵的操作”——你现在已经有了。 听说过C++程序员说的。但是,在两种语言中,动态内存分配的成本是一样的。

< P>我不知道C“耻辱”,而是调整C++。可以使用“放置新对象”自定义新对象的行为


但为什么要这样做呢?让编译器制造商做他们最擅长的事情

新建和删除通常使用malloc()和free()进行内存分配/释放。无论如何,他们必须使用一些原语来分配/释放内存——重载new和delete操作符,这可能比malloc()和free()更快(比如说,它可以是在固定大小对象的内存池中工作的函数)。通常情况下,除非您真的完成了这种重载,否则您将不会看到每种方式的内存分配成本有任何差异


不允许重新分配,因为并非所有数据类型都允许在内存中移动-它们需要调用复制构造函数和析构函数才能正确移动。例如,您可能在数组中存储了一些图形节点结构。如果你盲目地移动它们,指向对象之间的指针将变得无效。

为了彻底概括,C传统上被用于资源更为有限的环境中,这既是因为它存在的时间更长,也是因为它用于嵌入式应用程序。因此, MalOC/的潜在计算成本是一个令人担忧的问题,而C++在PC机上更常用,不必担心太多。
new
delete
可能由编译器以与malloc非常相似的方式实现,但它们有一个区别(这就是它们存在的原因)-它们调用相关项的构造函数和析构函数


当我说构造函数时,我当然是指任何需要的初始化(填写VTABLES、设置初始化器等)。这可能会使
new
delete
变慢,但在并排比较中(例如分配和释放
int
)没有根本区别。

realloc非常时髦,它将alloc、delete、realloc in-place或realloc-and-move(从而使其他指针无效)取决于实际参数和当前内存使用情况。也就是说,通过查看代码,你无法真正判断它将做什么。你是否有任何关于如何执行此操作的链接?因为realloc在很多时候只是分配一个新块,将旧数据复制到新块,然后释放原始块。如果您想要动态调整大小的数组,请在当天使用std::vectorBack?好吧,看看malloc的代码,你就会明白为什么即使在今天它仍然很昂贵。你认为为什么有这么多关于高效垃圾收集的研究?如果说有什么区别的话,今天的情况更糟,因为代码中有太多的alloc/free,而没有考虑成本。@xcramps:我想说的是,这是一个感知问题,而不是一个有形的技术差异。是的,即使在今天,频繁的重新分配也会使应用程序慢得多。这就是为什么vector::保留()。@是的,但有人必须在C++中编写<代码> STD::vector < /代码>。为什么那个人被拒绝了一个
realloc
等价物?实际上,做一个新的东西“可能”花费更多,因为每个项目都会调用构造函数…@Goz。基元类型的构造函数没有