【问题标题】:Does a pointer take up memory before assignment?指针在赋值之前会占用内存吗?
【发布时间】:2013-10-20 05:36:54
【问题描述】:

说我有这个:

int *thing;

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

另外,假设我有这个:

struct thingy
{
    int *intThing;
}

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

intThing 是否也会被删除,或者内存是否会四处飘荡而没有任何指向?

【问题讨论】:

  • 显然占用空间;当您声明一个变量时,会为其分配存储空间(除非编译器将其优化掉,但我们先不谈这个)。而且“删除”并不意味着“从内存中物理删除”。它只是意味着“告诉操作系统我不再打算使用这个内存区域”。
  • 指针是一个“保存”地址的变量,但这并没有改变一个简单的事实,它仍然是一个变量,因此是可寻址的,因此它本身占用空间。那个空间“在哪里”是另一回事,但它总是必须坐在“某个地方”。

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


【解决方案1】:

所有变量(原始数值类型、类实例、指针、引用)开始占用空间。

然后优化器参与进来,可能会显示一些存储是多余的(值是恒定的,或者总是可以从另一个变量中获得,等等)

使变量消失是优化器的明确目标之一,因为它倾向于减少寄存器压力、提高缓存性能等。

在您的示例中,指针 intThing 将被销毁(它是一个成员,并且成员在其父对象这样做时死亡),但它指向的内存(正确称为 *thingy.intThing 而不仅仅是 thingy.intThing ) 将不会。如果它的地址没有存储在其他任何地方,那么它就会被泄露。

【讨论】:

  • 所以澄清一下,正确的代码是delete thingy.intThing; delete thingy;?
  • @Clonkex:没错。或者使用像 std::unique_ptr 这样的智能指针来为你做这件事。
【解决方案2】:
  1. 指针大小取决于机器和创建它的操作系统。
  2. 如果您已分配或未分配任何内容,它将耗尽内存。
  3. 当您删除具有指向*intThingy 的指针的对象时,intThingy 不会被删除

【讨论】:

  • 您的意思是“指向*intThingy”,对吗? intThingy 是一个指针,我在这个问题中看不到任何双指针......“指向intThingy 的指针”在这里不存在
  • @BenVoigt 正确,已修复。
【解决方案3】:

指针本身是一个对象/变量,它占用空间(在堆栈或堆中),不应与它所指向的内容混淆。甚至char *p = nullptr 也会占用sizeof(*p) 字节的空间。

该标准保证机器中所有指针类型的大小相同,即sizeof(char*) == sizeof(void*) == sizeof(int*) 是真的。这取决于编译器和目标机器的架构。

主机是您编译代码的地方,而目标机器是您打算运行代码的地方。这两者可能不同,在这种情况下称为交叉编译。只有主机特征很重要(编译器也是如此)。假设主机是 64 位,但您的编译器只有 32 位,那么指针大小可能只有 4 个字节,而不是 8 个。

delete thingy; 之后,thingy 指向的对象将被删除,但thingy 本身不会被删除。但是thingy 仍将指向已删除对象所在的内存。绑定取消引用会导致未定义的行为(主要是崩溃)。因此,删除后通常设置为NULL。然而,还有另一个阵营认为将其设置为NULL 是有风险的,因为错误地尝试“重新删除”指针不会像它应该的那样崩溃(删除NULL 是一个无操作),从而隐藏了一个错误。

【讨论】:

  • 有错字,应该是sizeof(p)
【解决方案4】:

Pointer 是一种类似于 C++ 中其他类型的类型。指针本身会占用内存中的空间,并且只能指向您在创建该指针时指定的数据类型。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多