C++ 新建和删除超出范围的内存管理

C++ 新建和删除超出范围的内存管理,c++,memory-management,memory-leaks,new-operator,C++,Memory Management,Memory Leaks,New Operator,我应该删除哪些值? 我想我只删除了动态分配的c,其余的对象在函数结束时会自动销毁 e怎么样?它也是动态分配的,但是我们没有任何用于e的删除操作符。e是否未取消分配 谢谢 您将删除使用新分数(3,4)创建的对象 是e或者更严格地说是分配了新分数的内存(7,8)将不会解除分配,从而导致内存泄漏 您将删除使用新分数(3,4)创建的对象 是e或者更严格地说是分配了新分数的内存(7,8)将不会解除分配,从而导致内存泄漏 您应该删除c(或f),但不能同时删除两者,您应该删除e。对于每个new都应该delet

我应该删除哪些值? 我想我只删除了动态分配的c,其余的对象在函数结束时会自动销毁

  • e怎么样?它也是动态分配的,但是我们没有任何用于e的删除操作符。e是否未取消分配

  • 谢谢

  • 您将删除使用
    新分数(3,4)创建的对象
  • e
    或者更严格地说是分配了
    新分数的内存(7,8)将不会解除分配,从而导致内存泄漏
  • 您将删除使用
    新分数(3,4)创建的对象
  • e
    或者更严格地说是分配了
    新分数的内存(7,8)将不会解除分配,从而导致内存泄漏

  • 您应该删除
    c
    (或
    f
    ),但不能同时删除两者,您应该删除
    e
    。对于每个
    new
    都应该
    delete
    您应该删除
    c
    (或
    f
    ),但不能同时删除两者,您应该删除
    e
    。对于每个
    新的
    应该
    删除
    您应该删除(c或f)&e

    您应该删除(c或f)&e

    此处您可能缺少的关键洞察是
    delete
    与特定变量没有任何关系-它与存储在特定内存地址的特定对象有关系。通常的规则是“任何分配了
    new
    的对象都必须处理
    delete
    ”,但请注意object一词的使用不可变

    考虑:

    void f(const Fraction& a)
    { Fraction b = a;
      Fraction* c = new Fraction(3, 4);
      Fraction* d = &a;
      Fraction* e = new Fraction(7, 8);
      Fraction* f = c;
      delete f;
     }
    

    在本例中,我们删除了
    b
    ,它指向在第一行分配的
    分数
    对象。我们还可以删除
    a
    ,它指向相同的
    分数
    对象。只要我们删除分配给
    new
    的每个对象(无论我们使用哪个指针变量访问该对象),就不会有内存泄漏。还要注意,如果我们同时删除
    a
    b
    ,那么我们就有一个错误(通过a定义的行为未定义)。

    这里您可能缺少的关键洞察是
    delete
    与特定变量没有任何关系-它与存储在特定内存地址的特定对象有关系。通常的规则是“任何分配了
    new
    的对象都必须处理
    delete
    ”,但请注意object一词的使用不可变

    考虑:

    void f(const Fraction& a)
    { Fraction b = a;
      Fraction* c = new Fraction(3, 4);
      Fraction* d = &a;
      Fraction* e = new Fraction(7, 8);
      Fraction* f = c;
      delete f;
     }
    

    在本例中,我们删除了
    b
    ,它指向在第一行分配的
    分数
    对象。我们还可以删除
    a
    ,它指向相同的
    分数
    对象。只要我们删除分配给
    new
    的每个对象(无论我们使用哪个指针变量访问该对象),就不会有内存泄漏。还请注意,如果同时删除
    a
    b
    ,则会出现错误(通过a的行为未定义)。

    delete
    不会删除变量。它删除指针变量指向的已分配内存。您有两个
    new
    s和一个
    delete
    。你漏了一个
    分数
    。我想第三行是不可能的。你用一个(非常量)指针指向一个常量对象。一个更重要的问题是:当分数明显支持复制和赋值时,为什么要动态分配它?是的,那是我的错误。我试图找出哪些值被删除,哪些对象也被删除。谢谢<代码>删除
    不删除变量。它删除指针变量指向的已分配内存。您有两个
    new
    s和一个
    delete
    。你漏了一个
    分数
    。我想第三行是不可能的。你用一个(非常量)指针指向一个常量对象。一个更重要的问题是:当分数明显支持复制和赋值时,为什么要动态分配它?是的,那是我的错误。我试图找出哪些值被删除,哪些对象也被删除。谢谢但是他可以很容易地删除
    e
    f
    。(事实上,他已经删除了
    f
    ),但他可以同样轻松地删除
    e
    f
    。(事实上,他已经删除
    f