C++ "delete []" 运算符仅删除 2 个第一个值

C++ "delete []" operator removes only 2 first values

我刚开始学习 C++,我很难理解 delete [] 运算符的工作原理。我写了一段代码来看看它是如何工作的,但它只删除了数组的前 2 个元素。我的问题是如何删除数组?

代码如下:

#include <iostream>
int main()
{
    using namespace std;
    int size;
    cout << "Size: ";
    cin >> size;
    int * pt = new int [size];
    for(int i = 0; i < size; i++) {
        pt[i] = i + 1;
        cout << "Addrres: " << &pt[i] << " " << "Index: " << i << " "
             << "Value: " << pt[i] << " "   << endl;
    }
    cout << "----------DELETING----------" << endl;
    delete [] pt;

    for(int i = 0; i < size; i++) {
        cout << "Address: " << &pt[i] << " " << "Index: " << i << " "
             << "Value: " << pt[i] << " "   << endl;
    }
    return 0;
}

我的终端的示例结果是:

Size: 5
Address: 0x55d3060e4690 Index: 0 Value: 1 
Address: 0x55d3060e4694 Index: 1 Value: 2 
Address: 0x55d3060e4698 Index: 2 Value: 3 
Address: 0x55d3060e469c Index: 3 Value: 4 
Address: 0x55d3060e46a0 Index: 4 Value: 5 
----------DELETING----------
Address: 0x55d3060e4690 Index: 0 Value: 0 
Address: 0x55d3060e4694 Index: 1 Value: 0 
Address: 0x55d3060e4698 Index: 2 Value: 3 
Address: 0x55d3060e469c Index: 3 Value: 4 
Address: 0x55d3060e46a0 Index: 4 Value: 5 

我是编程初学者,所以我不知道这是必要的,但我 运行 Linux Mint 64 位。使用的编译器是g++。

当您 delete[] 元素时,它们 不一定 被删除。它们只是提供给系统以供重用。不允许事后访问它们(未定义的行为)。

如果您的数组持有带有析构函数的对象,那么 delete 也会导致析构函数成为 运行,然后才能使内存可供重新使用。

如果您想真正了解 delete [] 的工作原理,您需要尝试这样的操作

 class X42
 {
 public:
    virtual ~X42 () { cout << "Deleting " << this < endl ; } ;
 } ;


X42 *ptr = new X42 [42] ;
delete [] ptr ;

int 没有析构函数,因此删除中的数组元素没有发生任何特定情况。它们成为未定义的值。碰巧你的内存释放器只是破坏了已删除内存中的一些值。