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

Posted

技术标签:

【中文标题】C ++“删除[]”运算符仅删除2个第一个值[关闭]【英文标题】:C++ "delete []" operator removes only 2 first values [closed] 【发布时间】:2018-11-04 11:14:21 【问题描述】:

我刚开始学习 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 [] pt; 之后写pt = nullptr。当您进行第二次输出时,您的数组已经不存在。 FYI 你删除了之前分配的内存。删除意味着将其从程序的可用内存集中删除。这并不意味着应该覆盖以前使用的位。您的第二个循环查看这些位的内容,但您正在查看的内存不再属于您的程序范围。 Valgrind 之类的工具会告诉您您正在访问程序未分配的字节。 C++ 没有提供检查指针或参考点是否在有效项目上的方法。程序员始终有责任确保被访问的值没有被释放/没有超出范围。此外,在这种情况下检查项目是否“删除”的方法是完全错误的,因为它假设“删除”值变为0,而实际上int 具有微不足道的析构函数,因此delete [] 只执行内存释放,而不用担心数组内容。 如果你使用 Visual Studio 并编译一个 DEBUG 版本,它将帮助你找到那种错误。其他编译器肯定有类似的工具。前几个字节更改的原因可能是因为它们用于跟踪可用内存(想想空闲块链)。所有这些都是未定义/未指定的,因此编译器可以使用释放的内存来做他们想做的事情。 【参考方案1】: 当您delete[] 时,

元素不会必要被删除。它们只是可供系统重新使用。之后不允许访问它们(未定义行为)。

如果您的数组保存了带有析构函数的对象,那么delete 也会导致析构函数在内存可供重用之前运行。

【讨论】:

因此删除操作符使该地址再次可用。例如,创建的另一个数组可以使用相同的地址,因为该地址已被释放,对吗? 没错。【参考方案2】:

如果你想真正了解 delete [] 是如何工作的,你需要尝试这样的事情

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


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

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

【讨论】:

以上是关于C ++“删除[]”运算符仅删除2个第一个值[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

从命名的多维数组中删除一个值[关闭]

仅删除第一个和最后一个元素之外的中间元素

C语言 删除所有相同值的元素

如何关闭/打开 LSTM 层?

Codeforces Round 823 (Div. 2)C

如果另一个Dataframe值小于0,则替换R数据框中的值