代码之家  ›  专栏  ›  技术社区  ›  ComputerScientist101

使用新运算符返回指针。在哪里删除?

  •  1
  • ComputerScientist101  · 技术社区  · 2 年前

    我对C++相当陌生。

    所以我明白了 new 分配内存并返回我的数据类型指针。但我能在函数中使用它并返回指针吗?如果是这样,那么我应该将删除操作符放在哪里?

    以下代码合法吗?

    int *makeArray(int size)
    {
        int *result = new int[size];
    
        delete[] result;
        return result;
    }
    
    int main()
    {
        int *pointer = makeArray(10);
        /* code ... */
        return 0;
    }
    

    它正在编译和工作,但从逻辑上讲没有意义,因为我删除了我的数组。

    所以我尝试了以下方法:

    int *makeArray(int size)
    {
        int *result = new int[size];
    
        return result;
    }
    
    int main()
    {
        int *pointer = makeArray(10);
        /* code ... do some stuff with pointer */
        delete[] pointer;
        return 0;
    }
    

    这是安全的还是会导致内存泄漏?有没有更好的方法返回指针?

    我尝试了两个版本,它们正在编译和工作,但我确信至少有一个版本是不安全的。

    1 回复  |  直到 2 年前
        1
  •  3
  •   AidenDean    2 年前

    以下代码合法吗?

    int *makeArray(int size)
    {
        int *result = new int[size];
    
        delete[] result;
        return result;
    }
    
    int main()
    {
        int *pointer = makeArray(10);
        /* code ... */
        return 0;
    }
    

    肯定 ! 这是 Undefined behavior 因为你返回了一个删除的指针。在使用delete操作符之后,你告诉你的操作系统,它可以释放内存,并将其用于任何它想要的用途。读或写是非常危险的(程序崩溃、蓝屏、银河毁灭)

    int *makeArray(int size)
    {
        int *result = new int[size];
    
        return result;
    }
    
    int main()
    {
        int *pointer = makeArray(10);
        /* code ... do some stuff with pointer */
        delete[] pointer;
        return 0;
    }
    

    这是安全的还是会导致内存泄漏?

    是的,这是正确的使用方法 new 和删除运算符。你用 因此,即使数据超出范围,也会保留在内存中。无论如何,这不是最安全的代码,因为 必须有一个 delete delete[] 你不能把它们混在一起。

    有没有更好的方法返回指针?

    对它叫 Smart Pointer 在C++程序员中不应该使用 但还是聪明的指针。有一个C++社区编码指南来避免这些调用。 Guideline R11