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个第一个值[关闭]的主要内容,如果未能解决你的问题,请参考以下文章