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

时间:2018-11-04 11:14:22

标签: c++ arrays memory-management delete-operator

我刚刚开始学习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 

在编程方面,我是乞gg,所以我不知道这是必需的,但是我正在运行Linux Mint 64bit。使用的编译器是g ++。

2 个答案:

答案 0 :(得分:7)

当您delete[] {<1>}时,

没有必要 删除。它们仅提供给系统以供重新使用。此后不允许访问它们(未定义的行为)。

如果您的数组中包含带有析构函数的对象,那么delete还会导致析构函数运行,然后才能重新使用内存。

答案 1 :(得分:0)

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

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


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

没有用于int的析构函数,因此删除中的数组元素没有特定的变化。它们成为未定义的值。碰巧这种情况是您的内存解除分配器只破坏了已删除内存中的某些值。