释放对象数组:delete与delete[]

释放对象数组:delete与delete[]

<c++ primer>练习 14.11

<c++ primer> 练习 14.11 中提到:

Account *parray = new Account[100];
delete parray;
delete [] parray;

方括号的存在会使编译器获取数组大小(size)然后析构函数再被依次应用在每个元素上,一共 size 次。否则,只有一个元素被析构。无论哪种情况,分配的全部空间被返还给自由存储区。

我有问题:为什么无论哪种情况,分配的全部空间被返还给自由存储区?对于 delete parray, 为什么不是删除单个 Account 元素,而是删除了 100 个.编译器怎么知道 parray 这个指针实际指向的是数组还是单个元素,即便知道指向的是自由存储区的数组,这个数组的大小又怎么知道。难道是编译器辅助行为?

总结:空间释放(肯定有个log记录分配的大小)和调用析构函数(类型识别,不同的编译器不同)。

转自 <effective c++>

条款5:对应的 newdelete 要采用相同的形式

下面的语句有什么错?

string *stringarray = new string[100];
delete stringarray;

一切好象都井然有序——一个 new 对应着一个 delete ——然而却隐藏着很大的错误:程序的运行情况将是不可预测的。至少,stringarray 指向的 100 个 string 对象中的 99 个不会被正确地摧毁,因为他们的析构函数永远不会被调用。

new 的时候会发生两件事。首先,内存被分配(通过 operator new 函数,详见条款7-10和条款m8),然后,为被分配的内存调用一个或多个构造函数。用 delete 的时候,也有两件事发生:首先,为将被释放的内存调用一个或多个析构函数,然后,释放内存(通过 operator delete 函数,详见条款8和m8)。对于 delete 来说会有这样一个重要的问题:内存中有多少个对象要被删除?答案决定了将有多少个析构函数会被调用。

这个问题简单来说就是:要被删除的指针指向的是单个对象呢,还是对象数组?这只有你来告诉 delete。如果你在用 delete 时没用括号,delete 就会认为指向的是单个对象,否则,它就会认为指向的是一个数组:

string *stringptr1 = new string;
string *stringptr2 = new string[100];
...
delete stringptr1; // 删除一个对象
delete [] stringptr2; // 删除对象数组

如果你在 stringptr1 前加了 "[]" 会怎样呢?答案是:那将是不可预测的;

如果你没在 stringptr2 前没加上 "[]" 又会怎样呢?答案也是:不可预测。对 int 这样的固定类型来说,结果也是不可预测的,即使这样的类型没有析构函数。所以,解决这类问题的规则很简单:如果你调用 new 时用了 "[]", 调用 delete 时也要用 "[]"。如果调用 new 时没有用 "[]", 那调用 delete 时也不要用 "[]".

Read more

印度统治阶级锁死底层人的5大阳谋

印度统治阶级锁死底层人的5大阳谋

基于社会学和心理学视角: 1. 情感道德: 统治阶级通过塑造道德规范和情感价值观,引导底层人群的行为。例如,宣扬“勤劳致富”“忍耐美德”等观念,让底层人接受现状并自我约束。这种道德框架往往掩盖结构性不平等,使人们将个人困境归咎于自身而非系统。 2. 欲望控制: 通过消费主义和媒体宣传,统治阶级刺激底层人的物质与社会欲望(如名牌、地位),但同时设置经济壁垒,使这些欲望难以实现。底层人被困在追求“更好生活”的循环中,精力被分散,无法聚焦于挑战权力结构。 3. 情绪煽动: 利用恐惧、愤怒或民族主义等情绪,统治阶级可以通过媒体或公共事件转移底层人对社会问题的注意力。例如,制造外部敌人或内部对立(如阶层、种族矛盾),让底层人内耗而非联合反抗。 4. 暴利诱惑: 通过展示少数“成功案例”或快速致富的机会(如赌博、投机),诱导底层人追逐短期暴利。这种机制不仅让底层人陷入经济风险,还强化了对现有经济体系的依赖,削弱长期变革的可能性。 5. 权力震撼: 通过展示统治阶级的权力(

By Ne0inhk