说我有这个:
int *thing;
即使我没有分配任何内存,它是否使用4字节的内存?当我分配一些东西(thing=new int;
)时,它会使用8个字节,因为指针本身可能会使用内存吗?
另外,说我有这个:
struct thingy
{
int *intThing;
}
thingy *result=new thingy;
thingy.intThing=new int;
delete thingy;
是否会删除intThing
,或者内存是否会浮动而没有任何指向它的内容?
答案 0 :(得分:1)
intThingy
的对象时,不会删除*intThingy
醇>
答案 1 :(得分:1)
所有变量(原始数字类型,类实例,指针,引用)都开始占用空间。
然后优化器参与其中,并且可能显示某些存储是冗余的(值是常量,或者总是可以从另一个变量获得,等等)
使变量消失是优化器的明确目标之一,因为它倾向于降低寄存器压力,提高缓存性能等。
在您的示例中,指针intThing
将被销毁(它是成员,成员在其父对象执行时死亡),但它指向的内存(正确称为*thingy.intThing
而不是只是thingy.intThing
)不会。如果它的地址没有存储在其他任何地方,那么它就会被泄露。
答案 2 :(得分:0)
指针本身是一个占用空间(在堆栈或堆中)的对象/变量,不应该与它指向的内容相混淆。即使char *p = nullptr
占用sizeof(*p)
个字节的空间。
标准保证机器中所有指针类型的大小都相同。 sizeof(char *)== sizeof(void *)== sizeof(int *)为true。这取决于编译器和目标机器的体系结构。
主机是您编译代码的地方,而目标计算机是您打算运行代码的地方。这两个可以是不同的,在这种情况下它称为交叉编译。只有主机特性很重要(编译器也是如此)。假设主机是64位但编译器只是32位,那么指针大小可能只有4个字节,而不是8个。
在delete thingy;
之后thingy
指向的对象将被删除但不会thingy
本身。但是thingy
仍将指向已删除对象所在的内存。绑定取消引用会导致未定义的行为(主要是崩溃)。因此,删除后通常将其设置为NULL
。然而,还有另一个阵营认为将其设置为NULL
是有风险的,因为错误地尝试“重新删除”指针不会崩溃,因为它应该(删除NULL
是无操作)从而隐藏一个错误。
答案 3 :(得分:0)
指针是一种类似于C ++中其他类型的类型。指针本身占用内存中的空间,并且只能指向您在创建指针时指定的数据类型。
所以是的,即使你没有分配任何东西,指针也会占用内存空间。究竟有多少内存空间取决于它所创建的机器。