运算符C++ "delete []"仅删除 2 个前值
C++ "delete []" operator removes only 2 first values
我刚开始学习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没有析构函数,所以删除中的数组元素不会发生任何特定的事情。它们变成了未定义的值。恰好您的内存解除定位器只破坏了已删除内存中的一些值。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- C++中的线程安全删除
- 如何从存储在std::映射中的std::集中删除元素
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数