C++ 在适当的范围内使用动态内存

C++ 在适当的范围内使用动态内存,c++,new-operator,dynamic-memory-allocation,C++,New Operator,Dynamic Memory Allocation,我觉得在同一范围内使用new是一个很好的做法,应该使用delete。跟踪记忆要容易得多。例如,假设我有: 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

我觉得在同一范围内使用
new
是一个很好的做法,应该使用
delete
。跟踪记忆要容易得多。例如,假设我有:

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
}
这样,我会记得删除
o
。然而,这也给我带来了问题。我现在正在做一个更大的项目,我的
main()
开始看起来又大又乱,因为一堆语句可以很容易地组合在一个函数中

那么,在处理更大的项目(或任何规模的项目)时,我应该使用哪种做法,即,我应该在
main()中使用
new
为了更好地跟踪内存,但要付出messier代码的代价,还是应该在函数中使用
new
,以获得更干净的代码,但手动管理内存会稍微困难一些


如果这个问题太具体或者没有我所说的那么重要,我深表歉意。

你是对的,传递指针会使跟踪所有权变得困难。如果您可以访问C++11,则可以返回一个来表示将所有权传递给调用方的意图。 如果您只能访问C++03功能,那么也可以访问boost库功能

在适当的情况下使用
std::unique_ptr
std::shared_ptr
std::weak_ptr
也可以在异常处理发挥作用时简化内存管理(防止管理不善)

<> >使用< < < < <代码> > >代码>删除>代码>在现代C++中,编写自定义容器、分配器和其他下级任务的用途很少。
简而言之:尽可能使用智能指针,必要时使用手动内存管理。

最佳做法是永远不要直接使用
新的
——使用像
std::string
std::vector
那样为您管理内存的对象,如果您确实需要类似指针的东西,使用
std::make_unique
std::make_shared
创建
std::unique_ptr
std::shared_ptr
对象…

两个选项:返回值
Obj create()或返回智能指针:
std::unique_ptr create()
。如果使用C++11或更高版本,则可以使用
std::unique_ptr
std::shared_ptr
而不是原始指针。如果返回指针的原因是出于性能考虑,那么通常也可以按值返回新创建的对象,并从编译器获得返回值优化;设置(o);删除o和最好的一个:
Obj o;设置(&o);/*清理是自动的*/
这个答案是正确的,但是您不应该忽略使用本地范围的自动变量并完全避免动态分配的选项。