在这个程序中,我使用volatile寄存器对象,
我实际上是将物品存放在寄存器中吗?
为什么我将对象的地址设为1
?
请分享你的想法。
#include <iostream>
using namespace std;
class a{
int i,j,k[999];
long double arr[9999999];
public:
a(){
i=77; j=89;
cout<<"\nctor\n";
}
void disp()volatile {
cout<<"\ni = "<<i<<" j = "<<j<<"\n";
// delete this;
}
~a(){
cout<<"\ndtor\n";
}
};
int main(){
register volatile a *ao = new a;
cout<<"address of a = "<<ao; //out puts "1" for me; (My processor is core i3 330M).
ao->disp();
delete ao;
}
答案 0 :(得分:4)
这很明显,因为没有任何调用delete会导致内存泄漏。您需要显式调用delete以避免这种情况,甚至更好:使用智能指针。
此外,在C ++中将忽略该寄存器。它是basically deprecated.您可以从C ++标准中读取它:
寄存器说明符与自动说明符具有相同的语义,并且提供了对如此声明的对象将被大量使用的实现的提示。 [注意:提示可以忽略,在大多数实现中,如果采用对象的地址,它将被忽略。 - 后注]
因此,寄存器的使用是红鲱鱼。
印刷的1是由于以下原因:
“当你传入一个易失性指针时,第二个重载不能应用,因为没有显式强制转换,无法将易失性指针转换为非易失性。但是,任何指针都可以转换为bool,因此选择第一个重载,你看到的结果是1或0.“
...来自here。
因此,如果删除volatile,它将不再打印1
。
答案 1 :(得分:1)
您正在动态内存中构建对象。您需要通过调用&#34;删除ao&#34;来手动清理它。这不会自动完成。如果以某种方式ao去了范围并且你无法访问指向这个对象的指针那么你就会遇到所谓的内存泄漏,这是许多C ++程序员的主要痛点。
register关键字已在C ++ 11中弃用,也不是必需的。如果您使用编译器确认旧标准寄存器存储只是对编译器的请求,编译器可以自由地忽略它,尤其是当您需要对象的地址时。
答案 2 :(得分:1)
我的想法:在这里你可能试图通过使用volatile关键字来拒绝指针对象ao
的编译器优化,我是对的吗?但这是你得到&#39; 1的唯一原因! C ++标准说,即使您将对象或变量指定为register
,它也会在内部仅将其视为auto
。有关外线1
的详细信息,请参阅此link