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
都必须有一个 delete
或 delete[]
,您不能将它们混用。
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
我对 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
都必须有一个 delete
或 delete[]
,您不能将它们混用。
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