指针在分配之前是否会占用内存?

时间:2013-10-20 05:36:54

标签: c++ pointers memory new-operator delete-operator

说我有这个:

int *thing;

即使我没有分配任何内存,它是否使用4字节的内存?当我分配一些东西(thing=new int;)时,它会使用8个字节,因为指针本身可能会使用内存吗?

另外,说我有这个:

struct thingy
{
    int *intThing;
}

thingy *result=new thingy;
thingy.intThing=new int;
delete thingy;

是否会删除intThing,或者内存是否会浮动而没有任何指向它的内容?

4 个答案:

答案 0 :(得分:1)

  1. 指针大小取决于计算机及其创建的操作系统。
  2. 如果您已经或没有为其分配任何内容,它将耗尽内存。
  3. 删除指针指向intThingy 的对象时,不会删除
  4. *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 ++中其他类型的类型。指针本身占用内存中的空间,并且只能指向您在创建指针时指定的数据类型。

所以是的,即使你没有分配任何东西,指针也会占用内存空间。究竟有多少内存空间取决于它所创建的机器。