return 带有新运算符的指针。放在哪里删除?

return pointer with new operator. Where to put delete?

我对 C++ 还很陌生。

所以我了解到 new 分配内存并且 returns 是我的数据类型的指针。但是我可以在函数中使用它并使用 return 指针吗?如果是这样,那么我应该把删除运算符放在哪里?

下面的代码合法吗?

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;
}

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

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

Is the following code legal?

int *makeArray(int size)
{
    int *result = new int[size];

    delete[] result;
    return result;
}

int main()
{
    int *pointer = makeArray(10);
    /* code ... */
    return 0;
}

绝对不会!这是 Undefined behavior 因为你 return 一个删除的指针。使用 delete 运算符后,您告诉 OS 它可以释放内存并将其用于任何需要的地方。读取或写入它是非常危险的(程序崩溃,蓝屏,银河毁灭)

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;
}

Is this safe or does it cause a memory leak?

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

Is there a better way of returning the pointer?

是的。它被称为Smart Pointer. In C++ programmers shouldn't use new but smart pointer at all. There is a C++ community Coding Guideline to avoid these calls Guideline R11