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 没有析构函数,因此删除中的数组元素没有发生任何特定情况。它们成为未定义的值。碰巧你的内存释放器只是破坏了已删除内存中的一些值。
我刚开始学习 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 没有析构函数,因此删除中的数组元素没有发生任何特定情况。它们成为未定义的值。碰巧你的内存释放器只是破坏了已删除内存中的一些值。