动态分配的用法

cro*_*boy 0 c++ dynamic-memory-allocation

来自Java和C#,我习惯于做以下事情:

byte[] myArray = new byte[10];
Run Code Online (Sandbox Code Playgroud)

并不关心必须清理它.但是,现在我正在使用C++,你显然必须小心分配和内存泄漏.

我听说有人说你应该不惜一切代价避免动态分配,但我也看到有些人"自由地"使用它,使用new运算符在本地堆栈变量足够时实例化类:

DatabaseConnection conn = new DatabaseConnection("127.0.0.1");
// or
DatabaseConnection conn("127.0.0.1");
Run Code Online (Sandbox Code Playgroud)

我知道在堆上分配的数组要慢得多,但我倾向于使用动态内存可能导致的性能损失更易读和可扩展的代码.

所以,我的问题是:你是否应该不惜一切代价避免堆分配?

Mat*_*son 5

我建议在这种情况下,使用这个很好:

byte myArray[10]; 
Run Code Online (Sandbox Code Playgroud)

如果你需要一个数组,你可以复制(例如从函数返回),然后使用vector<byte>是正确的解决方案.

最后的手段应该是使用new,并且如果数据需要在函数外部预先分配,则仅分配小区域.

不幸的是,书籍并不总是告诉你好的做法,或者显示出你应该和不应该使用的好例子,例如new- 相反,它们显示的东西int *arr = new int[5];- 可能占用更多的空间而不是实际的数据.

当然,一切都new必须如此deleted.使用智能指针(shared_ptrunique_ptr)可以通过自动清理帮助很多.