C ++:是否有必要手动分配内存?

我对C ++编程的某些更高级的方面比较陌生,因此我很难理解是否真的有必要在C ++中分配内存(无论是通过malloc,new等)。 例如在C中,我知道你需要分配内存来获得动态调整大小的数组或其他任务。 在C ++中,在我看来情况并非如此,您可以使用std :: vector,std :: string或其他内置方法,这些方法已经通过设计动态调整大小。 我也明白,访问分配的内存比堆栈慢。

那么考虑到,是否有时候你必须用C ++分配内存,如果是这样,那么其中一个例子是什么? 这当然不包括您的C ++代码必须与C程序交互的时间。 假设程序纯粹是用C ++编写的。

编辑:为了减轻混淆,我明白矢量和其他结构正在分配它们自己的内存,但这是幕后发生的事情,并且不需要程序员使用new,malloc等,并且它会自动清理。 所以我真正想知道的是,是否有必要在C ++中手动执行内存管理


堆栈的大小有限,有些东西不能可靠地装入。 动态分配的内存对它们也具有动态性质,在这种情况下,有时您不确定在执行程序的某个时间点之前,您需要的数组中有多少个对象或元素。

看看这个问题,它很好地描述了每个可能的用例:

当您希望比以上更灵活时,堆分配(动态分配的内存)非常有用。 通常会调用一个函数来响应事件(用户单击“创建框”按钮)。 正确的响应可能需要分配一个新的对象(一个新的Box对象),该对象应该在函数退出后长时间存在,所以它不能在堆栈中。 但是你不知道在节目开始时你会想要多少盒子,所以它不能是静态的。

为了反映你的编辑:事实上它并不是真正需要的,或者说,它通常被抽象出来,就像vectorstring 。 你有各种各样的容器,像vector一样为你处理。 当你设计你自己的类时,鼓励你使用资源分配初始化(RAII)技术,它抽象出典型的手动内存管理。 事实上,在某些情况下,特别是在处理C代码时,鼓励您使用RAII的C ++类包装器或C ++智能指针(如C ++ 11中引入的那些)来管理该内存: shared_ptrunique_ptr (他们自己使用RAII)。


例如在C中,我知道你需要分配内存来获得动态调整大小的数组或其他任务。 在C ++中,在我看来情况并非如此,您可以使用std :: vector或其他内置方法,这些方法已经通过设计动态调整大小。

std::vector不是建立在魔法和仙尘之上的,但是:它在内部分配内存。

你是对的,在C ++中你很少需要手动分配内存。 有些情况下,这是最简单的方法1。 关键是C ++使得手动释放完全不必要,因为析构函数会照顾到这一点。


1非常非常罕见。 写得最好的代码根本不需要这个。 处理较低级别的细节时(例如在实现容器时)偶尔会很有用。


如果你的问题是“在C ++中动态分配的内存是不必要的?” 答案是非常必要,非常重要。

如果您的问题是“使用现代C ++ 11类和功能,我的代码需要多长时间手动使用' '和' 删除 '”?

答案是“很少”。 大多数新的和删除调用将隐藏在容器( std :: vectorstd :: map等)和智能指针( std :: shared_ptrstd :: unique_ptr )中,并通过调用函数std: :make_shared()

你会在极少数情况下需要手动调用'新'和'删除'吗? 这取决于你正在制作的节目的类型,但如果他们是电子游戏,我会说是的,可能是1%的时间(我的经验,但YMMV),你需要使用手动新建删除 std :: make_shared()std :: shared_ptr - 虽然它将取决于项目。

一般来说,更喜欢在堆栈上分配的局部变量和成员变量(忽略它们是否在内部分配动态内存),接下来更喜欢C ++ 11托管动态内存(智能指针),最后求助于newdelete作为最后的手段if性能要求它(但不要预先优化 - 配置文件并找到真正的瓶颈)。

请注意,仅仅因为你用智能指针来管理你的内存,并不意味着你应该禁止你的代码中的所有原始指针 - 即使你的所有内存都被管理了,仍然非常真实地使用与内存生命周期管理无关的原始指针。

链接地址: http://www.djcxy.com/p/13799.html

上一篇: C++: Is it ever absolutely necessary to allocate memory manually?

下一篇: Creating C++ objects