删除运算符的未定义行为

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