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

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

本文关键字:删除 C++ delete 运算符      更新时间:2023-10-16

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

这是代码:

#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没有析构函数,所以删除中的数组元素不会发生任何特定的事情。它们变成了未定义的值。恰好您的内存解除定位器只破坏了已删除内存中的一些值。