在适当的范围内使用动态内存
Using dynamic memory in the proper scope
我觉得在应该使用delete
的相同范围内使用new
是一个很好的做法。跟踪记忆要容易得多。例如,假设我有:
class Obj;
Obj* create() {
Obj* object = new Obj();
// do a bunch of messy work with object
return object;
}
int main() {
Obj* o = create();
}
上面代码的问题是 o
需要被释放并不是很明显。因此,我宁愿:
int main() {
Obj* o = new Obj();
// do a bunch of messy work with o
}
这样我就记得delete
o
。但是,这也给我带来了问题。我目前正在处理一个更大的项目,我的 main()
开始看起来又大又乱,因为一堆语句可以很容易地组合在一个函数中。
那么在处理较大的项目(或与此相关的任何规模的项目)时我应该使用哪种做法,即我应该在 main()
中使用 new
以更好地跟踪内存但支付混乱代码的价格还是我应该在函数中使用 new
以获得更清晰的代码,但手动管理内存会稍微困难一些?
如果这个问题太具体或不如我想的那么重要,我深表歉意。
你是对的,传递指针使得跟踪所有权变得困难。如果您有权访问 C++11,则可以 return 和 std::unique_ptr 来表达将所有权传递给调用者的意图。
如果您只能访问 C++03 功能,boost 库也具有 boost::unique_ptr。
使用std::unique_ptr
std::shared_ptr
和 std::weak_ptr
在适当的地方也可以在异常处理发挥作用时简化内存管理(防止管理不善)。
使用 new
和 delete
在现代 C++ 中除了编写自定义容器、分配器和其他较低级别的任务外几乎没有什么用处。
简而言之:尽可能使用智能指针,必要时使用手动内存管理。
最佳做法是永远不要直接使用 new
——使用为您管理内存的对象,例如 std::string
和 std::vector
,如果您真的需要类似指针的对象事情,使用 std::make_unique
和 std::make_shared
来制作 std::unique_ptr
或 std::shared_ptr
对象...
我觉得在应该使用delete
的相同范围内使用new
是一个很好的做法。跟踪记忆要容易得多。例如,假设我有:
class Obj;
Obj* create() {
Obj* object = new Obj();
// do a bunch of messy work with object
return object;
}
int main() {
Obj* o = create();
}
上面代码的问题是 o
需要被释放并不是很明显。因此,我宁愿:
int main() {
Obj* o = new Obj();
// do a bunch of messy work with o
}
这样我就记得delete
o
。但是,这也给我带来了问题。我目前正在处理一个更大的项目,我的 main()
开始看起来又大又乱,因为一堆语句可以很容易地组合在一个函数中。
那么在处理较大的项目(或与此相关的任何规模的项目)时我应该使用哪种做法,即我应该在 main()
中使用 new
以更好地跟踪内存但支付混乱代码的价格还是我应该在函数中使用 new
以获得更清晰的代码,但手动管理内存会稍微困难一些?
如果这个问题太具体或不如我想的那么重要,我深表歉意。
你是对的,传递指针使得跟踪所有权变得困难。如果您有权访问 C++11,则可以 return 和 std::unique_ptr 来表达将所有权传递给调用者的意图。 如果您只能访问 C++03 功能,boost 库也具有 boost::unique_ptr。
使用std::unique_ptr
std::shared_ptr
和 std::weak_ptr
在适当的地方也可以在异常处理发挥作用时简化内存管理(防止管理不善)。
使用 new
和 delete
在现代 C++ 中除了编写自定义容器、分配器和其他较低级别的任务外几乎没有什么用处。
简而言之:尽可能使用智能指针,必要时使用手动内存管理。
最佳做法是永远不要直接使用 new
——使用为您管理内存的对象,例如 std::string
和 std::vector
,如果您真的需要类似指针的对象事情,使用 std::make_unique
和 std::make_shared
来制作 std::unique_ptr
或 std::shared_ptr
对象...