删除运算符的未定义行为
Undefined behaviour of delete operator
我是 C++ 的新手,正在学习指针。我试图为数组动态分配一些内存并发现了这个问题。
这是我的代码,
#include <iostream>
int main(){
int n = 5;
int *arr = new int(n*(sizeof(int)));
for(int i=0; i<n; i++)
*(arr+i) = i+1;
delete[] arr;
for(int i=0; i<n; i++)
std::cout << *(arr+i) << " ";
}
并且预期的输出是一些垃圾值,因为我正在使用 delete 运算符释放内存,但是,这是我的输出:
首先运行:
755597344 47626 2043 4 5
第二个运行:
-1437908960 62859 2043 4 5
第三个运行:
-902037472 965 2043 4 5
我已经尝试了几次 运行,但只有前 3 个值发生变化,而其他值似乎仍然存在,对此有何解释?
new int(n*(sizeof(int)));
这仅分配单个 int 并将值设置为 n*(sizeof(int))
。
如果你想要 int 数组,你必须像下面那样做。
int *arr = new int[n];
一小段代码中存在多个错误和问题:
表达式new int(n*(sizeof(int)))
分配一个单个int
值并将其初始化为值n*(sizeof(int))
。
如果要为 int
个值的数组分配 space,则需要使用 new[]
,如 new int[n]
由于上述问题,您将越界分配的内存,导致未定义的行为.
修复问题 1 后,您需要将 new[]
与 delete[]
运算符配对。运算符不匹配还会导致 未定义的行为 .
最后,一旦你删除了内存,你就不能再访问它,任何取消引用指针的尝试都会再次导致未定义的行为。
总而言之,程序应该如下所示:
#include <iostream>
#include <cstdlib>
int main()
{
constexpr std::size_t n = 5;
// Allocate memory
int* arr = new[n];
// Initialize the memory
for (std::size_t i = 0; i < n; ++i)
{
arr[i] = i + 1;
}
// Display the memory
for (std::size_t i = 0; i < n; ++i)
{
std::cout << "arr[" << i << "] = " << arr[i] << '\n';
}
// Free the memory
delete[] arr;
}
综上所述,有更好的方法来创建固定或动态大小的数组。
如果您有一个 fixed-size 数组,其大小在 compile-time 时已知并且其大小在 run-time 期间永远不会改变,请改用 std::array
:
// Create and initialize array
std::array<int, 5> arr = {{ 1, 2, 3, 4, 5 }};
// Display array
for (int value : arr)
{
std::cout << value << '\n';
}
如果在 compile-time 时不知道大小,或者在 run-time 期间需要更改大小,请改用 std::vector
:
// Create a vector with five "zero-initialized" elements
std::vector<int> arr(5);
我是 C++ 的新手,正在学习指针。我试图为数组动态分配一些内存并发现了这个问题。
这是我的代码,
#include <iostream>
int main(){
int n = 5;
int *arr = new int(n*(sizeof(int)));
for(int i=0; i<n; i++)
*(arr+i) = i+1;
delete[] arr;
for(int i=0; i<n; i++)
std::cout << *(arr+i) << " ";
}
并且预期的输出是一些垃圾值,因为我正在使用 delete 运算符释放内存,但是,这是我的输出:
首先运行:
755597344 47626 2043 4 5
第二个运行:
-1437908960 62859 2043 4 5
第三个运行:
-902037472 965 2043 4 5
我已经尝试了几次 运行,但只有前 3 个值发生变化,而其他值似乎仍然存在,对此有何解释?
new int(n*(sizeof(int)));
这仅分配单个 int 并将值设置为 n*(sizeof(int))
。
如果你想要 int 数组,你必须像下面那样做。
int *arr = new int[n];
一小段代码中存在多个错误和问题:
表达式
new int(n*(sizeof(int)))
分配一个单个int
值并将其初始化为值n*(sizeof(int))
。如果要为
int
个值的数组分配 space,则需要使用new[]
,如new int[n]
由于上述问题,您将越界分配的内存,导致未定义的行为.
修复问题 1 后,您需要将
new[]
与delete[]
运算符配对。运算符不匹配还会导致 未定义的行为 .最后,一旦你删除了内存,你就不能再访问它,任何取消引用指针的尝试都会再次导致未定义的行为。
总而言之,程序应该如下所示:
#include <iostream>
#include <cstdlib>
int main()
{
constexpr std::size_t n = 5;
// Allocate memory
int* arr = new[n];
// Initialize the memory
for (std::size_t i = 0; i < n; ++i)
{
arr[i] = i + 1;
}
// Display the memory
for (std::size_t i = 0; i < n; ++i)
{
std::cout << "arr[" << i << "] = " << arr[i] << '\n';
}
// Free the memory
delete[] arr;
}
综上所述,有更好的方法来创建固定或动态大小的数组。
如果您有一个 fixed-size 数组,其大小在 compile-time 时已知并且其大小在 run-time 期间永远不会改变,请改用 std::array
:
// Create and initialize array
std::array<int, 5> arr = {{ 1, 2, 3, 4, 5 }};
// Display array
for (int value : arr)
{
std::cout << value << '\n';
}
如果在 compile-time 时不知道大小,或者在 run-time 期间需要更改大小,请改用 std::vector
:
// Create a vector with five "zero-initialized" elements
std::vector<int> arr(5);