1

说我有这个:

int *thing;

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

另外,假设我有这个:

struct thingy
{
    int *intThing;
}

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

也会intThing被删除,或者内存会漂浮在没有任何指向它的地方吗?

4

4 回答 4

1
  1. 指针大小取决于机器和创建它的操作系统。
  2. 如果您有或没有为它分配任何东西,它将耗尽内存。
  3. intThingy当您删除具有指向的指针的对象时不会被删除*intThingy
于 2013-10-20T05:46:40.607 回答
1

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

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

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

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

于 2013-10-20T06:13:23.607 回答
0

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

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

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

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

于 2013-10-20T05:50:53.800 回答
0

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

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

于 2013-10-20T06:04:10.873 回答