关于c++中new和delete的长度问题

在使用标准的g++时,new的时候在申请地址的前面会有个结构保存申请到的内存的长度,具体说明结合代码说明:

该代码在64位机器上的运行结果为:

第一个字节49表示48+1,第二个字节3表示3*256 = 768,后面几个字节全0

代码中我申请了200个Test,每个Test类大小为4字节,所以需要800个字节,然后还需要8个字节用来保存一个指针的空间,共需要808个字节,在64位机器上以16对齐,所以申请的内存大小为816(768+48 = 816),至于第一个字节最后的那个1应该是个标志位,应该是表示available的意思,即内容可用。

 

同样的代码在32位机器上运行有点不同,由于32位机器以8位对齐,所以每次增加8为,然后那个指针大小也变成了4,所以同样的代码在32位机器上的结果是:

第一个字节41= 40+1= 32+8(以8对齐),第二个字节3表示3*256 =768,后面全0

代码依旧是200个Test,每个Test类大小为4字节,所以需要800个字节,在32位机器上需要4个字节用来保存一个指针的空间,共需要804个字节,在32位机器上以8对齐,所以申请的内存大小为816(768+48 = 808),第一个字节的最后的那个1同样是个标志位,反表示available的意思,即内容可用。

 

上述情况对于任何对象都成立,包括基本数据类型(int,double,char)等

对于标准的gcc的malloc和free同样符合上述说明

 

UPDATE ON Apr. 28, 2011

I read a book about this problem and i find i was wrong when i write this article. the correct approach for this problem is there are 4 bytes previous the start address of the allocated memory which is used to record the length of the memory allocated. and the lower 3 bits are used to work as flag bit which cannot be considered when calculating the length. and the size of memory allocated will allign to 8 bytes. of course in the 64 bit machine, there will be 8 bytes to be used to record the length of memory and address will be alligned to 16 bytes.

### C++ 中 `delete` `delete[]` 的区别 在 C++ 编程语言中,动态内存分配是一个重要的概念。为了有效地管理释放这些资源,C++ 提供了两个操作符:`delete` `delete[]`。 #### 单一对象的删除 (`delete`) 当通过 `new` 关键字为单一对象分配内存时,应使用 `delete` 来释放该内存。这不仅会释放分配给对象的空间,还会调用对象的析构函数来执行清理工作[^3]。如果尝试使用 `free()` 而不是 `delete`,则不会触发析构函数的行为,从而可能导致未定义行为或资源泄漏。 ```cpp MyClass* obj = new MyClass(); // 使用obj... delete obj; // 正确方式,调用了析构函数并释放内存 ``` #### 数组对象的删除 (`delete[]`) 对于通过 `new[]` 创建的对象数组而言,则需采用 `delete[]` 形式来进行销毁。这是因为每一个单独元素都需要被适当地解构;即每项都必须经历一次对应的析构过程以确保所有成员变量得到妥善处理[^5]。如果没有指定 `[ ]` 符号仅运用普通的 `delete` ,程序可能无法正确地遍历整个数组并对每个实例分别应用各自的终止逻辑,进而引发潜在错误甚至崩溃风险。 ```cpp MyClass* arr = new MyClass[10]; // 使用arr... delete[] arr; // 正确方式,逐个调用每个元素的析构函数后再释放整体存储区域 ``` 值得注意的是,在现代C++实践中推荐尽可能依赖智能指针(如unique_ptr 或 shared_ptr)以及容器类(像std::vector),它们能够自动管理生命周期内的资源回收问题,减少手动干预带来的失误几率。 ### 总结对比表 | 特性 | `delete` | `delete[]` | |--------------------|-----------------------------------|------------------------------------| | **适用场景** | 单独对象 | 对象数组 | | **析构调用次数** | 一次 | 等于数组长度 | 以上就是关于两者之间主要差异性的阐述说明。 ```cpp #include <iostream> using namespace std; class Test { public: ~Test(){ cout << "Destructor called\n"; } }; int main () { Test *singleObj = new Test; delete singleObj; Test *arrayOfObjs = new Test[3]; delete [] arrayOfObjs; return 0; } ``` 上述例子展示了如何恰当利用这两个关键字完成各自的任务需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值