【发布时间】:2022-10-12 22:01:05
【问题描述】:
// createArray_1 returns the array as a return value
double* createArray_1( ) {
return new double [ 10 ];
}
// createArray_2 returns the array from the parameter list
// (using a reference parameter)
void createArray_2( double*& arr ) {
arr = new double [ 10 ];
}
// createArray_3 returns the array from the parameter list
// (without using a reference parameter but simulating
// pass-by-reference using a pointer)
void createArray_3( double** arr ) {
*arr = new double [ 10 ];
}
// What is wrong with the following two functions?
// void incorrectCreateArray_1( double* arr ) {
// arr = new double [ 10 ];
//}
// double* incorrectCreateArray_2( ) {
// double arr[ 10 ];
// return arr;
// }
我们有主要功能:
int main() {
double* D;
D = createArray_1();
delete [] D;
createArray_2( D );
delete [] D;
createArray_3( &D );
delete [] D;
return 0;
}
你能帮我理解为什么 create_array2 和 create_array3 是正确的,而 wrongCreateArray_1 和 wrongCreateArray_2 是错误的吗?
对我来说,不正确的CreateArray_1 应该没问题,因为我们正在传递一个指针,然后为其分配一个大小为 10 的双精度数组,这似乎是正确的。
另一方面,correctArray_2 返回一个双精度指针,这应该没问题,因为 arr 指向一个双精度数组,这似乎也是正确的。
【问题讨论】:
-
请使用
std::vector一次解决许多问题。自 C++11/14 以来,不鼓励显式使用new和delete(并且在数组的情况下更长时间 - 因为引入了 std::vector)。 -
一般来说,数组是一种 C 结构,最好在 C++ 中完全避免。通过
std::vector(或者,如果真的需要,std::array)更安全、更直观。 -
非常感谢您的建议。我会记住这一点。但是,我认为理解这段代码有什么问题可以帮助我更好地理解整个指针。
-
incorrectCreateArray_1仅更改参数(它是传递的指针的副本)而不是原始指针。incorrectCreateArray_2返回一个指向局部变量的指针,该变量在函数返回时被销毁并导致一个悬空指针。 -
问题是变量的范围和生命周期。
incorrectCreateArray_1修改本地值,因此结果不会传递到外部。incorrectArray_2使用在函数退出时生命周期结束的本地数组,因此返回的指针悬空导致未定义的行为。
标签: c++ arrays pointers delete-operator